多一些Aha Time,发现技术的美妙🍺|

啊原来是这样呀

园龄:8年3个月粉丝:3关注:9

【算法基础】11.十大排序算法——快速排序

参考资料

C/C++实现快速排序(只掌握第一种即可)

 

直观理解

选中一个元素作基准值,然后遍历剩余的元素,小的放左边、大的放右边,基准始终或者最后放在中间;

如果允许空间复杂度>1,可以开2个栈,小的放一个栈大的放一个栈,合并时先弹小栈、再放基准值、最后弹大栈,这种思想比较朴素,不必研究;

如果不允许空间复杂度>1,则在原内存上进行操作,肯定要用到双指针,至于双指针怎么用则有不同的方法;

 

例子先行

双指针从两端出发,关键在与二者之间必有一个处于可写入状态,接下来处理的值分大小情况存入二者之一指向的地方

图解参考:https://www.jb51.net/article/219584.htm

复制代码
 1 int Partition(int A[],int low,int high){
 2     int pivot=A[low];//第一个元素作为基准,此时low指向的地方可写入
 3     while(low<high){
 4         while(low<high && A[high]>=pivot) high--;//寻找小值
 5         A[low]=A[high];//将小值写入low指向的地方,写完之后high指向的地方可写入
 6         while(low<high && A[low]<=pivot) low++;//寻找大值
 7         A[high]=A[low];//将大值写入high指向的地方,写完之后low指向的地方可写入
 8     } 
 9     A[low]=pivot;//将基准值放在可写入的地方,这里low和high必然已经重合
10 
11     return low;
12 }
13 
14 void QuickSort(int A[],int low,int high){
15     if(low<high){
16         int pivotpos=Partition(A,low,high);//获取中间值所在位置
17         QuickSort(A,low,pivotpos-1);//对小值部分再快排
18         QuickSort(A,pivotpos+1,high);//对大值部分再快排
19     }
20 }
复制代码

 

总结提炼

 1分治思想

想办法把整体分为大小两部分,再分别快排

2快排逻辑

在不新开内存的前提下,从左端或右端选取一个基准值,然后在一次遍历中使用双指针将元素按大小分为两部分,最终返回基准值的坐标,以便上层继续快排

 

拓展方向

 暂无

本文作者:啊原来是这样呀

本文链接:https://www.cnblogs.com/OhOfCourse/p/16915361.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   啊原来是这样呀  阅读(8)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起