我观看了快速排序算法的精彩可视化:http ://www.youtube.com/watch?v=Z5nSXTnD1I4
我觉得我真的理解了快速排序背后的原理,并在一些在线指南的帮助下,着手创建自己的快速排序。
这就是我想出的:
public void quickSort(int[] a, int left, int right) {
int index = partition(a, left, right);
if (left < index - 1)
quickSort(a, left, index);
if (index < right)
quickSort(a, index + 1, right);
}
private int partition (int[] a, int left, int right) {
int i = left - 1;
int j = right + 1;
int pivot = a[0];
while (i < j) {
i++;
while (a[i] < pivot)
i++;
j--;
while (a[j] > pivot)
j--;
if (i < j)
swap (a, i, j);
}
return i;
}
private void swap (int[] a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
left 和 right 的值如下:
left = 0
right = array size - 1
不幸的是,输出不正确。问题似乎在于我对支点的处理。在我观看的可视化中,讲师物理地移除了枢轴,并使指针指向任何东西。他继续教程,当他到达 i 和 j(我称之为左和右)都指向同一个空白点时,他插入枢轴并继续。
由于我在物理上将枢轴固定在适当的位置,因此我发现很难对其进行正确分类。
在这段代码中,我正在处理输入:
4 8 1 6 3 7 2 5
我得到输出:
1 3 2 6 8 7 4 5
一旦在算法的一开始就对“4”值(即枢轴)进行排序,我就从不使用它,这会把所有东西都扔掉。另外,我认为 quickSort 方法有问题。
有人可以给我一些指示吗?谢谢。
编辑:此处的两个编辑已被删除,因为它们包含不必要和不正确的信息。其中一个将枢轴更改为:(左+右)/ 2。由于下面的答案中解释的原因,这当然是错误的。