【算法基础】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快排逻辑

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

 

拓展方向

 暂无

posted @ 2022-11-23 09:43  啊原来是这样呀  阅读(15)  评论(0)    收藏  举报