排序算法总结

快速排序的空间复杂度为什么是logN?

快速排序的递归代码如下:

    public static void sort(int[] a, int lo, int hi) {

        if(hi<=lo) return;
        int j = partision(a, lo, hi);
        sort(a, lo, j-1);
        sort(a, j+1, hi);
    }

每次递归都会返回一个中间值的位置 j , 必须使用栈存储,所以空间复杂度就是栈用的空间(栈中存储j的个数)。

j所占用栈的空间大小为 logN,这里计算栈中存储j的个数这需要考虑 递归调用 sort(a, lo, j-1) 即可,因为调用 sort(a, j+1, hi) 时, sort(a, lo, j-1)所产生的j已经释放了。

归并排序每次递归需要用到一个辅助表,长度与待排序的表相等,虽然递归次数是O(log2n),但每次递归都会释放掉所占的辅助空间,所以下次递归的栈空间和辅助空间与这部分释放的空间就不相关了,因而空间复杂度还是O(n)。

原文地址:https://www.cnblogs.com/deltadeblog/p/8595582.html