比较排序2:快速排序

sorting(按从小到大排序)

一、快速排序(交换排序)

不稳定排序

步骤:

1、选择主元数据 x , 把序列分为两个子序列(<=x 和 >x)

2、按第一步递归处理两个子序列

c++代码:

//处理sequence[p~q]子序列
void  QuickSort(vector<int>& sequence, int p, int q)
{
    int x = sequence[p];  //主元
    int i = p, temp;  //前i个元素小于等于主元x
    for(int j=p+1; j<=q; ++j)
    {
        if(sequence[j]<=x)
        {
            ++i;  //第j个元素小于等于x,则小于等于x的个数i要加1
            //现在的第i个元素是原本的第i+1个元素,放的是大于x的元素,因此将其与第j个元素交换
            temp = sequence[i];
            sequence[i] = sequence[j];
            sequence[j] = temp;
            // 交换后前i个元素小于等于主元x
        }

    }
    // 将sequence[p]即x与sequence[i]交换
    // 则sequence[p~i-1]小于等于x,sequence[i]=x,sequence[i+1~q]大于x
    sequence[p] = sequence[i];
    sequence[i] = x;

    //处理小于等于主元的子序列
    if(i-p <= 1)
        return;
    else
        QuickSort(sequence, p, i-1);

    //处理大于主元的子序列
    if(q-i <= 1)
        return;
    else
        QuickSort(sequence, i+1, q);
}

空间复杂度:除了序列本身外,只有temp

                   S(n) = θ(1)

时间复杂度:

最好情况:若每次递归,主元排序后恰好在序列中间,分成两个长度为n/2的子序列

                则T(n) = θ(nlgn)

最坏情况:每次递归,主元将序列分为长度为n-1和1的两个子序列

                T(n) = θ(n^2)

优化:随机化快速排序,每次随机选主元,而不是选第一个,

            T(n) = θ(nlgn)

猜你喜欢

转载自blog.csdn.net/qw_sunny/article/details/80624324