排序一个零,一和二的数组

时间:2015-06-01 00:42:00

标签: java arrays algorithm

我试图以这样的方式对数组进行排序,使得所有的零首先出现,然后是1,然后是2。

  

输入:{0,1,2,1,2,2,0,0,1};

     

输出:{0,0,0,1,1,1,2,2,2};

以下是我的程序,它对我的​​上述输入无效:

public class SeggregateZeroOneTwos {

    public static void main(String[] args) {
        int[] a = { 0, 1, 2, 1, 2, 2, 0, 0, 1 };
        arrangeNumbers(a);
        System.out.println(Arrays.toString(a));
    }

    public static void arrangeNumbers(int[] arr) {
        int low = 0;
        int high = arr.length - 1;
        int i = 0;
        while (i < high) {
            if (arr[i] < 1) {
                swap(arr, i, low);
                low++;
                i++;
            } else if (arr[i] > 1) {
                swap(arr, i, high);
                high--;
            } else {
                i++;
            }
        }
    }

    public static void swap(int[] arr, int i, int j) {
        arr[i] = arr[i] ^ arr[j];
        arr[j] = arr[i] ^ arr[j];
        arr[i] = arr[i] ^ arr[j];
    }
}

我得到的输出你可以看到,0介于1和2之间。代码出了什么问题?

[0, 0, 1, 1, 1, 0, 2, 2, 2]

3 个答案:

答案 0 :(得分:1)

尚未检查高位数。

    while (i <= high) {

答案 1 :(得分:1)

从快速看,您似乎只需要使用i <= high

while (i <= high) 

答案 2 :(得分:1)

或者您可以使用计数排序:使用三个计数器单次扫描数组。然后将#0#1&#39; s,#2写回数组。

计数排序适用于:

  • 可能的域值已知且基数较小
  • 允许少量额外存储空间(等于基数)

计数排序为O(n) - 比任何比较排序都快。