小编典典

为什么QuickSort使用O(log(n))多余的空间?

algorithm

我已经实现了以下quicksort算法。在线我已经读到它的空间要求为O(log(n))。为什么会这样呢?我没有创建任何额外的数据结构。

是因为我的递归将在堆栈上使用一些额外的空间吗?如果是这种情况,是否可以通过使其不递归(而不是使其迭代)而用更少的内存来完成?

private static void quickSort (int[] array, int left, int right) {
    int index = partition(array, left, right);

    //Sort left half
    if (left < index - 1)
        quickSort(array, left, index - 1);

    //Sort right half
    if (index < right)
        quickSort(array, index , right);
}

private static int partition (int array[], int left, int right) {
    int pivot = array[(left + right) / 2]; //Pick pivot point
    while (left <= right) {
        //Find element on left that should be on right
        while (array[left] < pivot)
            left++;

        //Find element on right that should be on left
        while (array[right] > pivot)
            right--;

        //Swap elements and move left and right indices
        if (left <= right) {
            int temp = array[left];
            array[left] = array[right];
            array[right] = temp;
            left++;
            right--;
        }
    }
    return left;
}

阅读 307

收藏
2020-07-28

共1个答案

小编典典

正确,多余的空间是log(n)堆栈帧。来自QuicksortWikipedia文章

daccess-ods.un.org daccess-ods.un.org还有一个更复杂的版本,它可以平均使用O(log
n)空间(不计算输入)来实现完整的排序 (对于调用堆栈)

尽管您 可以 迭代实现quicksort(即,使用循环而不是递归),但是您将需要维护一个辅助堆栈,因为Quicksort有 两个
递归调用,而不仅仅是一个。

最后,正如其他的答案已经指出,O(日志(n))的是几乎所有的实际应用非常, 非常 小。每个常量因素(如数据结构的开销)都会对内存使用产生更大的影响。

2020-07-28