- 快速排序(C语言版 ):时间复杂度=n log n ,空间复杂度:log n
算法步骤:
-
从数列中挑出一个元素,称为 “基准”(pivot);
-
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
-
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;
算法演示:
代码:
首先是严蔚敏,严奶奶的标准分割函数:(看读懂其中的那两句A[low] = A [high] 和A[high] = A [low],这样执行完第一句A[low]不会改变吗,之后进行寻找大于pivot的时候难道不会跳过某个数吗?。。。)
然后是自己写的。。。
1 int Parititionl(int *A,int low,int high){ 2 //确定基准位置为当前low值 3 int pivot = *( A + low); 4 //将首元素(基准)暂存 5 int *temp = A + low; 6 //当low与high相差一时(即当前集合只存在两个数,此时直接判断大小交换即可) 7 if (low +1 == high) { 8 if(A[low] > A[high]) 9 swap(A+low,A+high); 10 else return low; 11 //当low与high相等时(即当前集合只有1个数)无需交换 12 } else if (low == high) { 13 return low; 14 //当上述两个条件不满足时,low值加一(因为low未加一前为基准pivot,该值不参与交换,加1后的low~high之间进行交换) 15 } else low +=1; 16 //在low游标不超过high的前提下进行(相碰时证明当前轮结束) 17 while (low < high){ 18 //高位小于基准时(寻找小于基准pivot的数)。 19 while (low < high && A[high] >= pivot) 20 --high; 21 //低位大于基准时(寻找大于基准pivot的数)。 22 while (low < high && A[low] <= pivot) 23 ++low; 24 //low大于等于基准,high小于等于基准时,二者交换 25 swap(A+low,A+high); 26 } 27 //low等于high时,将暂存的基准temp与low交换,也可以与high交换(此时,low与high二者相等) 28 swap(temp,A+low); 29 return low; 30 } 31 32 void QuickSort(int *A ,int low, int high){ 33 if (low < high ){ 34 //将数组分为左右两部分 35 int pivot = Parititionl(A ,low ,high); 36 //左部分递归 37 QuickSort(A,low,pivot-1); 38 //右部分递归 39 QuickSort(A,pivot+1,high); 40 }