交换排序之快速排序原理、源码及时间、空间复杂度

版权声明:本人才疏学浅,欢迎大家批评指正,互相讨论学习。 https://blog.csdn.net/scuyxi/article/details/70306910

快速排序的原理:分治策略和递归

分治策略

分治的基本思想是将原问题分解为若干与原问题结构相似的小问题,递归地解决这些小问题,小问题的解就组合为原问题的解。

基本方法

  1. 选基准
  2. 基准放中间,划分为左右两个区域(左小又大)
  3. 再递归地采用该方法分别解决左右两个区域的排序。

源码

尽可能地减少递归调用的次数

//quick_sort
template <class T>
int quick_sort(T* t, int s, int e)
{
    int compare_times = 0;
    bool right = true;
    T middle = t[s];
    int i = s, j = e;
    while(i < j)
    {
        if(right && (t[j] < middle))
        {
            t[i] = t[j];
            right = false;
        }
        else if(!right && (t[i] > middle))
        {
            t[j] = t[i];
            right = true;
        }
        right ? j-- : i++;
        compare_times++;
    }
    t[i] = middle;
    if(s < i-1)
    {
        int st = quick_sort(t, s, i-1);
        compare_times += st;
    }
    if(e > j+1)
    {
        int et = quick_sort(t, j+1, e);
        compare_times += et;
    }
    return compare_times;
}

template <class T>
int sort(T* t, int n)
{
    if(n > 1)
        return quick_sort(t, 0, n-1);
    return 0;
}

执行结果

这里写图片描述

时间复杂度

平均时间复杂度:

o(nlog2n)

最坏时间复杂度:(已经排好序的情况下)
o(n2)

空间复杂度

递归调用时系统要保留栈空间
平均空间复杂度:

o(log2n)

最坏空间复杂度:(已经排好序的情况下)
o(n)

猜你喜欢

转载自blog.csdn.net/scuyxi/article/details/70306910
今日推荐