快速排序详细讲解和代码实现

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)

大家不清楚的地方·,可留言评论。因画图复杂,我没有画图。给大家找了一篇带图的博文,大家可以看图示。

Guess you like

Origin blog.csdn.net/t18438605018/article/details/119862902