快速排序的算法复杂度分析

原文地址:
快速排序的算法复杂度分析
以下是快排的java算法:

public class QuickSort {
    public static void quickSort(int a[], int start, int end) {
        if (start >= 0 && end <= a.length - 1 && start < end) {
            int low = start;
            int high = end;
            int splitKey = a[start];
            while (start < end) {
                while (start < end && a[end] >= splitKey) end--;
                a[start] = a[end];
                while (start < end && a[start] <= splitKey) start++;
                a[end] = a[start];
            }
            a[end] = splitKey;
            quickSort(a, low, start - 1);
            quickSort(a, start + 1, high);
        }
    }

    public static void quickSort(int a[]) {
        quickSort(a, 0, a.length - 1);
    }
}

大家都知道快排的时间复杂度是O(n*ln[n]),那么这个复杂度是如何计算出来的呢?

最好的情况下,每次划分对一个记录定位后,要记录的左侧子序列与右侧子序列的长度相同。在具有n个记录的序列中,一次划分需要对整个待划分序列扫描一遍,所需的时间为O(n)。

T_n是对n个记录的序列进行排序的时间,每次划分后,正好把划分区域分为长度相等的连个子序列,显然T(0)=T(1) =1,则有:

image.png

最坏的情况下,待排序的记录序列正序或逆序,每次划分只能得到一个比上一次划分少一个记录的子序列,(另一个子序列为空)。此时,必须经过n-1次递归调用才能把所有记录定位,而且第i趟划分需要经过n-i次比较才能找个才能找到第i个记录的位置,因此时间复杂度为

image.png

平均情况下,设轴值记录的关键码第k小(1≤k≤n),则有:

image.png

由上式可推出如下两式:

image.png

两式相减,然后两边同除以n(n+1)得

image.png

又因为f(n)单调递减,单调有界数列极限定理,所以f(n)有界

image.png

此数称为欧拉常数,

约为 0.57721566490153286060651209

所以

image.png

所以

image.png

**如果有何处不当,请不吝赐教,一定多加完善。谢谢 **

参考资料:

【1】《算法设计与分析》第二版 王红梅

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 简单排序 插入排序 想象一下插队的过程... 一个人通过插队的方式排到前面,而将原本在他前面的人挤到了后面的位置。...
    Kasheem_Lew阅读 5,393评论 0 4
  • 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序...
    jiangliang阅读 5,247评论 0 1
  • Ba la la la ~ 读者朋友们,你们好啊,又到了冷锋时间,话不多说,发车! 1.冒泡排序(Bub...
    王饱饱阅读 5,779评论 0 7
  • 文/平心小语 01 晚上,在广场上,快两周岁的奇奇,张着两只胖乎乎的小手,高兴地在在广场的一角颠...
    平心小语阅读 1,738评论 1 3
  • 劳力士是零咖啡馆的一位常客,他倒不是每天戴着劳力士,而是每次来咖啡馆,都会换一块新的名牌手表,从最早的劳力士绿水鬼...
    刀爷阅读 3,882评论 8 12

友情链接更多精彩内容