快排的原理和实现 -- 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