快速排序法事应用最广泛的排序算法之一,最佳情况下时间复杂度是 O(nlogn)。但是最坏情况下可能达到O(n^2)。说明快速排序达到最坏情况的原因。并提出改善方案并实现之。
答:
最坏情况就是,每次分都分出有一部分只有一个元素的。这样T(n) = n + T(n-1) = O(n*n);
最好的情况下,就是每次都各分一半。这样T(n) = 2*T(n/2)+n = 2*log2(n) + n*log2(n) = O(nlog2(n))
改进方案:改进选取枢轴的方法
1.随机选。2.选端值或者中心值。3.选取到中位数(不过觉得选到来。。。还不如排序了吧)
最终,选择用第一种,拼人品。
排序思想:分而治之,选取到一个值,以他为准,分两半,对这两半递归再分,直至只有一个元素。
#include <iostream>
#include <stdio.h>
#include <time.h>
using namespace std;
int myrand(int low , int high){
return (rand()%(high - low))+low;
}
template<typename T>
void quicksort(T * array,int low,int high){
if( low < high){
int x = array[myrand(low,high)];
int i = low,j = high;
while( i < j){
// 从左往右找到大于x的数
while(i < j && array[i] < x)
i++;
// 从右往左找到小于x的数
while(i < j && array[j] > x)
j--;
//如果i<j就交换值
if(i < j)
swap(array[i],array[j]);
}
quicksort(array,low,i - 1);
quicksort(array,i+1,high);
}
}
int main(){
srand(unsigned int(time(NULL)));
int array[10];
for(int i = 0;i<10;i++)
array[i] = myrand(0,100);
for(auto& elem : array)
cout << elem << " ";
cout << endl;
quicksort(array,0,9);
for(auto& elem : array)
cout << elem << " ";
cout << endl;
system("pause");
return 0;
}