【算法基础】11.十大排序算法——快速排序
参考资料
直观理解
选中一个元素作基准值,然后遍历剩余的元素,小的放左边、大的放右边,基准始终或者最后放在中间;
如果允许空间复杂度>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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步