【发布时间】:2013-02-28 12:32:59
【问题描述】:
我正在尝试了解快速排序机制,但到目前为止我无法弄清楚。根据维基百科,步骤是:
1. 从列表中选择一个元素,称为枢轴。
2. 重新排序列表,使所有值小于枢轴的元素都在枢轴之前,而所有值大于枢轴的元素都在它之后(相等的值可以去任何一种方式) .在此分区之后,枢轴处于其最终位置。这称为分区操作。
3.将上述步骤递归地应用于具有较小值的元素的子列表和具有较大值的元素的子列表。
这是代码:
int partition(int arr[], int left, int right)
{
int i = left, j = right;
int tmp;
int pivot = arr[(left + right) / 2];
while (i <= j) {
while (arr[i] < pivot)
i++;
while (arr[j] > pivot)
j--;
if (i <= j) {
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
j--;
}
}
return i;
}
void quickSort(int arr[], int left, int right) {
int index = partition(arr, left, right);
if (left < index - 1)
quickSort(arr, left, index - 1);
if (index < right)
quickSort(arr, index, right);
}
除了一件事,我都清楚了。为什么分区函数返回i而不是j?
【问题讨论】:
-
它可以返回任何一个,具体取决于您将枢轴放入哪个组。
-
如果我把
return j;而不是return i;,对于数组{3,2,4,1}程序崩溃 -
@Theo.:那是因为您拥有的
quickSort函数期望partition返回第二个分区的第一个元素的索引。将其更改为期望最后一个元素的索引将是一个非常微不足道的更改。 -
是的,我就是这么想的,但为什么我找不到任何其他不返回第二个分区中第一个元素的索引的
quickSort示例? -
@Theo。 “我在电视上看过,应该是真的。” - 并非所有可能的程序的所有可能的正确实现都已编写(还)。