算法帝国
精通算法者,集数千宠爱于一生,睥睨程序,智慧人生......
快排的原理和实现 -- C语言

我们看看快排的百科原理:

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

比较抽象,打个比方,如以下十个数:

4 5 1 0 27 1 637 25 125 62

通过一趟排序,把数据分割成两部分,一部分比另外一部分小。开始我们以 4为基准:

1、从右往左找到比 4大,交换位置,下一步

2、从左往右找到比4小,交换位置

1 0 1 4 27 5 637 25 125 62

4左边比右边都小,以此类推。


C语言代码如下:

// c 快排
#include <stdio.h>

void csort(int *arr,int first,int end);
void cswap(int *a ,int *b);

int main(){
    int arr[10] = {45,10,27,16,37,25,12,5,6,2},i;
    csort(arr,0,9);
    for(i=0;i<10;i++) printf("%d ",arr[i]);
    return 1;
}
void csort(int *arr,int first,int end){
    if(first >= end ){ return; }
    int tmp = first;
    int total = end;
    int flag= 1; //从左开始
    while( first < end ){
        if( flag == 1){  // 从左开始
            if( *(arr+tmp) > *(arr+end) ){  // 当前位置大于 > 结束
                cswap( (arr+tmp) (arr+end) );
                tmp = end;
                first++;
                flag = 2;
            }else end --; 
        }else{  // 从右往左
            if( *(arr+tmp) < *(arr+first) ){
                cswap( (arr+tmp) (arr+first) );
                tmp = first;
                end --; 
                flag = 1;
            }else first ++; 
        }   
    }   
    csort(arr,0,tmp-1);  // 左边排序
    csort(arr,tmp+1,total); // 右边排序
}

结果为:

0 1 1 4 5 25 27 62 125 637
<< 上一篇 PHP <<< 定界符 H5 浏览器存储 websql 使用详情及实例 下一篇 >>
文章标签
随意 | Created At 2014 By William Clinton | 蜀ICP备14002619号-4 |