【陷阱】交换排序中交换动作的陷阱

static void swap(int[] data, int i, int j) {

        //记得加此条件,data[i]与data[j]相同时异或运算得0
        if (data[i] != data[j]) {
            data[i] = data[i] ^ data[j];
            data[j] = data[i] ^ data[j];
            data[i] = data[i] ^ data[j];
        }
    }

    static void sort(int[] data, int begin, int end) {
        if (begin < end) {
            int cur = data[begin];
            int i = begin;
            int j = end + 1;
            while (true) {
                while (i < end && cur >= data[++i])
                    ;
                while (j > begin && cur <= data[--j])
                    ;
                if (i < j) {
                    swap(data, i, j);
                } else {
                    break;
                }
            }

            swap(data, begin, j);
            sort(data, begin, j - 1);
            sort(data, j + 1, end);
        }
    }

    public static void main(String[] args) {
        int[] data = { 2, 1, 3, 8, 4, 9 };
        sort(data, 0, 5);
        System.out.println(Arrays.toString(data));
    }

在上述例子中有3^3的情形发生,最后得出0导致排序有误。

异或运算进行数组元素互换时记得比较连个元素值是否相等。

posted @ 2013-04-21 16:08  Introspector  阅读(553)  评论(0编辑  收藏  举报