快速排序(Quick Sort)
快速排序(Quicksort)是对冒泡排序的一种改进,是最常用的一种排序算法。快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
快速排序的基本步骤:
Ø 将最左侧元素作为“枢轴”放入“哨所”。
Ø 设置low和high指向数组两端。
Ø high向左移动,一旦遇到小于哨所元素的元素则将其移入左边low位置。
Ø low向右移动,一旦遇到大于哨所元素的元素则将其移入右边high位置。
Ø high和low从左右交替移向中间,直至high = low.此时枢轴左侧均小于等于枢轴值,右侧均大于等于枢轴值。
Ø 将枢轴记录填入重叠位置即完成一次划分。
Ø 递归实现枢轴左侧和右侧部分
排序过程图:
![](https://i-blog.csdnimg.cn/blog_migrate/dc039b5f25bce5f805f1630942aee56a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a74888a1ce9603cfc041752b91369c4b.gif)
时间复杂度:
最好时间复杂度: O(N*logN) 最坏时间复杂度: O(N2) 平均时间复杂度:O(N*logN)
空间复杂度:
O(logN)
稳定性:
不稳定
代码:
int Partition(int arr[], int low, int high) {
arr[0] = arr[low];
while(low < high) {
while(high > low && arr[high] >= arr[0]) high--;
arr[low] = arr[high];
while(low < high && arr[low] <= arr[0]) low++;
arr[high] = arr[low];
}
arr[low] = arr[0];
return low;
}
void QSort(int arr[], int low, int high) {
if(low < high) {
int pivotLog = Partition(arr, low, high);
QSort(arr, low, pivotLog - 1);//递归
QSort(arr, pivotLog +1, high);//递归
}
else return;//边界
}