关于快排指针的几点思考
近来复盘剑指offer21题的时候,得到了新的体会,特来分享一下。
我们都知道(maybe you do not know),应用快速排序时,我们需要维护两个指针,但是具体指针初始化在哪里,具体如何移动,终止条件又是如何,我们来具体探讨一下。
一般而言,这两个指针有两种形式,一种是一前一后,当然另一种也是一前一后,不过有不同之处,请诸位看官来看:
一、
public static void reOrderArray(int[] array) {
//考虑输入边界条件
if (array == null || array.length == 0)
return;
//设置两个指针,之所以这样设置,是为了可以用++index,简化代码,代码简洁之道get一下
int left = -1;
int right = array.length;
//终止条件为两指针重合
while (left < right) {
//与运算前面应是下标关系式,避免数组下标越界,这一点很重要,初学者谨记
while (left < right && (array[++left] & 0x1) == 1);
//后面的位运算是考虑数组变量是否为奇数
while (left < right && (array[--right] & 0x1) != 1);
if (left < right)
swap(array, left, right);
}
}
二、
public static void reOrderArray2(int[] array) {
if (array == null || array.length == 0)
return;
//look,这里指针和前面不同了
int i = 0;
int j = i - 1;
//整体遍历一遍
for (i = 0; i < array.length; i++) {
//条件是奇数
if ((array[i] & 0x1) == 1) {
j++;
//优化不必要的交换
if (i != j)
swap(array, i, j);
}
}
}
因为快排交换是不稳定的,所以这两种算法的结果也是不同。