快速排序算法不稳定。
快速排序算法在大多数的计算机上运行得都比其他排序算法快,而且排序算法消耗资源少。就平均时间而言快排是所有内部排序中最好的一个。对于已经排好的数组,最速排序有最坏时间复杂度为o(n^2)。当数组长度很小时,快排往往比其他排序方法要慢。
快排的代码,关键是parition算法。
void QuickSort(int arr[],int low,int high)
{
if(low<high){
int pivotPos = partion(arr,low,high);
QuickSort(arr,low,pivotPos-1);
QuickSort(arr,pivotPos+1,high);
}
}
Paition的三种实现方法
(1)arr[low]的第一个元素为pivot,设两个指针lessIndex=low(该索引之前的数比pivot小,初始值为low),另一个i从low+1开始遍历数组,找到一个比pivot小的数,lessIndex+1,然后交换到前面来。
int partion1int arr[],int low,int high)
{
if(!arr||low<0||low>high)
throw new exception("NULL Array");
//left第一个元素被当做pivot
int pivot = arr[low];
int lessIndex = low;
for(int i=low+1;i<=high;++i){
if(arr[i]<pivot){
lessIndex++;
if(lessIndex!=i){
int temp = arr[lessIndex];
arr[lessIndex] = arr[i];
arr[i] = temp;
}
}
}
//这一步破坏了稳定性
arr[low] = arr[lessIndex];
arr[lessIndex] = pivot;
return lessIndex;
}

本文介绍了快速排序算法,强调其在大多数情况下的高效性,但也指出其在特定情况下的局限性,如数组长度小、pivot选择不当以及大量重复元素时的效率问题。通过讨论非递归实现和改进算法,包括在小规模子序列使用插入排序、跳过小规模子序列以及三数取中位数作为pivot的方法,以提升排序性能。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



