1.快速排序
快排的基本思想是分治策略:在待排序表L[1…n]中任意取一个元素pivot作为基准。通过一趟比较大小将待排序表L[1…n]划分为独立的两部分L[1…k-1]和L[k+1…n],使得L[1…k-1]中所有元素小于pivot,L[k+1…n]中所有元素大于或等于pivot。,pivot放在了最终位置L[k]上,这样就完成了第一趟快排。
然后,再分别递归地对两个字表重复上述过程,直至每部分只有一个元素或空为止。这样,排序完成。
2.代码实现
快排函数为QuickSort(),划分函数为Partition(),返回的是上述中的k。
#include<iostream>
using namespace std;
//Partition()划分操作,将表A[low,high]划分为满足上述条件的两个子表
int Partition(int A[],int low,int high)
{
//严蔚敏版数据结构教材中的划分算法
int pivot = A[low];//将当前表中第一个元素的值作为基准,对表进行划分
while(low<high)
{
while (low < high && A[high] >= pivot)
{
high--;
}
A[low] = A[high];//将比基准小的元素移至左端
while (low < high && A[low] <= pivot)
{
low++;
}
A[high] = A[low];//将比基准大的元素移至右端
}
A[low] = pivot;//将基准元素放到最终位置
return low;//返回存储基准的最终位置
}
void QuickSort(int A[], int low, int high)
{
if (low < high)//递归跳出的条件
{
int pivotpos = Partition(A,low,high);//划分
QuickSort(A,low, pivotpos-1);//依次对两个子表进行递归排序
QuickSort(A,pivotpos + 1,high);
}
}
int main()
{
int A[] = {
4,5,6,1,2,3};
QuickSort(A, 0, 5);
for(int i=0;i<6;i++)
cout << A[i] << endl;
return 0;
}
时间复杂度分析:
快排的时间去复杂度与划分Partition()有很大关系。在理想情况下,划分的两个子问题大小接近或相等,这是,算法的效率将极大提高。此时,时间复杂度O(nlog2n),n* 以2为底n的对数.
快排时间复杂度推导:
最坏情况下,划分得极其不对称。此时,时间复杂度O(n*n)
大家不清楚的地方·,可留言评论。因画图复杂,我没有画图。给大家找了一篇带图的博文,大家可以看图示。