四种优化方式
快速排序是通常被认为在同数量级(O(nlog2n))的排序方法中平均性能最好的。但若初始序列按关键码有序或基本有序时,快排序反而蜕化为冒泡排序,这是优化快速排序就很有必要了。
优化在Patition函数中进行:
一、优化选取基准点:三数取中法
即,将排序区间的两个端点与中点三个数中居中的数调整为基准点。
在Patition()函数中while循环前加入:
int mid=low+(high-low)/2;
if(arr[low]>arr[high])
swap(&arr[low],&arr[high]);
if(arr[mid]>arr[high])
swap(&arr[mid],&arr[high]);
if(arr[mid]>arr[low])
swap(&arr[mid],&arr[low]);
二、省去不必要的交换
Patition函数中频繁地交换其实有些是不必要的,可以省去,只用赋值就可以了
pointKey=arr[low];
while(low<high)
{
while(low<high&&pointKey<=arr[high]) high--;
arr[low]=arr[high];
while(low<high&&pointKey>=arr[low]) low++;
arr[high]=arr[low];
}
arr[low]=pointKey;
return low;
三、优化小数组时的排序方案
快速排序在序列较长的数组排序时效率较高。我们可以对长度大于k的子序列递归调用快速排序,让原序列基本有序,而小于k时采用插入排序。实验证明,k取值为7时,改进算法的性能最佳。
(等待补充)
四、优化递归操作
使递归变为尾递归,节省栈空间。
(待补充)