和归并排序做对比:
归并排序时间复杂度:
快速排序时间复杂度:
快速排序最差时间复杂度:
解决方法:随机化快排
快速排序的最坏情况基于每次划分对主元的选择。基本的快速排序选取第一个元素作为主元。这样在
数组已经有序的情况下,每次划分将得到最坏的结果。一种比较常见的优化方法是随机化算法,即随机选取一个元素作为主元。这种情况下虽然最坏情况仍然是O(n^2),但最坏情况不再依赖于输入数据,而是由于
随机函数取值不佳。实际上,随机化快速排序得到理论最坏情况的可能性仅为1/(2^n)。所以随机化快速排序可以对于绝大多数输入数据达到O(nlogn)的期望
时间复杂度。一位前辈做出了一个精辟的总结:“随机化快速排序可以满足一个人一辈子的人品需求。”
随机化快速排序的唯一缺点在于,一旦输入数据中有很多的相同数据,随机化的效果将直接减弱。对于极限情况,即对于n个相同的数排序,随机化快速排序的时间复杂度将毫无疑问的降低到O(n^2)。解决方法是用一种方法进行扫描,使没有交换的情况下主元保留在原位置。
代码:
#include<iostream>
using namespace std;
int partition(int arr[], int l, int r) {
//通过随机方式,取任意一个值作为每次划分对主元
swap(arr[l], arr[rand() % (r - l + 1) + l]);
int v = arr[l];
int j = l;
for (int i = l + 1; i <= r; i++)
if (arr[i] < v) {
j++;
swap(arr[j], arr[i]);
}
swap(arr[l], arr[j]);
//返回j的位置
return j;
}
void quickSort(int arr[], int l, int r) {
if( l >= r )
return;
int p = _partition2(arr, l, r);
quickSort(arr, l, p - 1);
quickSort(arr, p + 1, r);
}
int main() {
int arr[8] = { 4,3,7,8,2,1,6,5 };
quickSort(arr,0,7);
for (int i = 0; i < 8; i++)
{
cout << arr[i] << " ";
}
return 0;
}
总结:认真领悟: