图解数据结构---快速排序(存疑)
发布时间: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 ?
算法步骤:
算法演示:
代码: 首先是严蔚敏,严奶奶的标准分割函数:(看读懂其中的那两句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 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |