写一些对快速排序的详细分解,这里是对给定的key,返回其在数组中的位置
关键源代码如下:
public static int partition(int[] array, int left, int right) {
int k = array[left];
int i = left;
int j = right;
while (j > i) {
while (array[j] > k && j > i) {
j--;
}
if (j > i) {
array[i] = array[j];
i++;
}
while (array[i] < k && j > i) {
i++;
}
if (j > i) {
array[j] = array[i];
j--;
}
}
array[i] = k;
return i;
}
分解一下,第一个循环的操作包括:
while (array[j] > k && j > i) {
j--;
}
if (j > i) {
array[i] = array[j];
i++;
}
这里是从右边起寻找到比k更小的第一个数,然后将找到的数复制给 array[i] ,key ( array[i] )由k暂存。
while (array[i] < k && j > i) {
i++;
}
if (j > i) {
array[j] = array[i];
j--;
}
寻找到比k大的第一个元素,将找到的元素( array[i] )赋值给上面找到的比k更小的第一个数的元素,即 array[j] 。然后第一轮循环结束。
已知此时 array[j] 已经由进行i++操作之前的第i个元素存储,所以第一轮循环,简要地说就是下面的1和2:
1、将比k小的元素放到 array[i] 的位置 (第一次循环所以,array[i] = k = key = a[left] )
2、将比k大的元素放到步骤1找到的这个比k小的元素的位置
3、若 i < j,循环继续
4、将key ( 保存在k ) 赋值回 array[i]
可以看到,因为 k 保存了 array[left],使得数组中有一个位置可以临时空出,所以算法实现中交叉寻找较小的数字和较大的数字,这样空位每次换位预留。具体来说,(按执行顺序)先空出 array[i] ,在最外层的while内,先空出 array[j] 再空出 array[i] ,在最后将 k 放回 array[i]。