https://blog.csdn.net/qq_36528114/article/details/78667034
https://www.cnblogs.com/foreverking/articles/2234225.html
具体的算法过程,网上十分多,这里不再多余说了,上面两个是我看的觉得不错的。
一些直接上我写的代码:
#include<iostream> using namespace std; //左右指针法 void quicksotr(int a[],int i,int j){ int key = a[i]; //基准 int left = i; int right = j; if(left >=right) return; while(right>left){ //右边开始扫描,寻找比key小的 while(right>left && a[right] >= key){ right--; } //左边开始扫描,寻找比key大的 while(right>left && a[left] <= key){ left++; } //交换 swap(a[left],a[right]); } swap(a[right],a[i]); //key值交换 quicksotr(a,i,left-1); quicksotr(a,left+1,j); } //填坑法 void quicksotr2(int a[],int i,int j){ int key = a[i]; //基准 int left = i; int right = j; if(left >= right) return; while(right > left){ //右边开始扫描,寻找比key小的 while (right > left && a[right] >= key){ right--; } a[left] = a[right]; //左边开始扫描,寻找比key大的 while(right > left && a[left] <= key){ left++; } a[right] = a[left]; } a[right] = key; quicksotr2(a,i,left-1); quicksotr2(a,left+1,j); } int main(){ int a[10] = {2,1,5,9,8,7,3,2,1,6}; quicksotr(a,0,9); int b[10] = {2,1,5,9,8,7,3,2,1,6}; quicksotr2(b,0,9); return 0; }
Quicksort最糟糕的情况是什么时候发生的?
答案取决于选择枢轴的策略。在快速排序的早期版本中,最左侧(或最右侧)的元素被选为主点,最糟糕的情况发生在以下情况。
1)数组已按照相同的顺序排序。
2)数组已按相反顺序排序。
3)所有元素都相同(情况1和2的特例)
由于这些情况是非常常见的用例,通过选择随机索引作为主键,选择分区的中间索引或(特别是对于更长的分区),选择第一个,中间和最后一个元素的中值枢轴的分区。通过这些修改,快速排序的最坏情况发生的几率较小,但如果输入数组总是选择最大(或最小)元素作为枢轴,则最坏情况仍会发生。
快速排序的优化,在上面的连接中也有介绍到