我已经实现了以下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; }
正确,多余的空间是log(n)堆栈帧。来自Quicksort的Wikipedia文章:
daccess-ods.un.org daccess-ods.un.org还有一个更复杂的版本,它可以平均使用O(log n)空间(不计算输入)来实现完整的排序 (对于调用堆栈) 。
尽管您 可以 迭代实现quicksort(即,使用循环而不是递归),但是您将需要维护一个辅助堆栈,因为Quicksort有 两个 递归调用,而不仅仅是一个。
最后,正如其他的答案已经指出,O(日志(n))的是几乎所有的实际应用非常, 非常 小。每个常量因素(如数据结构的开销)都会对内存使用产生更大的影响。