加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

图解数据结构---快速排序(存疑)

发布时间:2020-12-14 04:36:17 所属栏目:大数据 来源:网络整理
导读:参考:https://mp.weixin.qq.com/s?__biz=MzUyNjQxNjYyMg==mid=2247483963idx=1sn=dd58fafb86a43eec3dcdc2a2def8fcb7scene=19#wechat_redirect ? 快速排序(C语言版 ):时间复杂度=n log n ,空间复杂度:log n 算法步骤: 从数列中挑出一个元素,称为 “基

参考: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 high){
33     if (low < high ){
34         //将数组分为左右两部分
35         int pivot = Parititionl(A,low,high);
36         //左部分递归
37         QuickSort(A,pivot-1);
38         //右部分递归
39         QuickSort(A,pivot+1,high);
40     }
View Code

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读