参考:https://mp.weixin.qq.com/s?__biz=MzUyNjQxNjYyMg==&mid=2247483963&idx=1&sn=dd58fafb86a43eec3dcdc2a2def8fcb7&scene=19#wechat_redirect

 

  • 快速排序(C语言版 ):时间复杂度=n log n ,空间复杂度:log n

  算法步骤:

  1. 从数列中挑出一个元素,称为 “基准”(pivot);

  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

  3. 递归地(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     }
View Code

 

posted on 2019-03-22 23:09  kingofloong  阅读(200)  评论(0编辑  收藏  举报