#对于快速排序的具体介绍就不用赘述了。这里记录几点要点。
设定L0,R0为需排序数组的起点终点,L,R为检查到达的位置。
选取数组的首端(L0)或者尾端(R0)元素为基准元素q,如果是L0则从R0开始往前检查,R0则从L0开始往后检查,很显然,这样的话基准元素q始终位于L或者R位置,最后排序完成时,R=L=q的位置。
快速排序是一种就地排序(就地排序就按照字面意思理解即可),L前的和R后的位置是已经检查排序完了的。这也是为什么一直交换R,L就可以排序完成的原因,这样交换可以不去创造新的空间。
时间复杂度最坏情况O(n^2),期望情况O(nlgn)。
#代码实现:
int num[]; //排序的数组num //交换num[L],num[R] void swap(int L,int R) { int temp; temp=num[L]; num[L]=num[R]; num[R]=temp; } //降序排序 void QS(int L,int R) { int q; //设定基准值q int L0=L; //需排序的数组左端 int R0=R; //需排序的数组右端 q=num[R]; //q取尾端元素 while(L<R) { //找到左端比q小的数,交换 while(num[L]>=q&&R>L) L++; swap(L,R); //左端寻找完一次,从右端开始,找到右端比q大的数,交换 while(num[R]<=q&&R>L) R--; swap(L,R); } //分治(递归) if(R>L0) QS(L0,R-1); if(L<R0) QS(L+1,R0); }
#函数库
快速排序函数
qsort(void*begin,int num,int width,int (*f)(const void*a,const void*b));包含在stdlib.h中
begin为排序开始地址,num为需排序元素个数,width为每个元素的大小,f为指向比较函数的指针(比较函数通常自己写,qsort();得到返回值,return 负; 表示a<b,return 0; 表示a=b, return 正; 表示a>b)