快速排序的空间复杂度为什么是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)。