我试图以这样的方式对数组进行排序,使得所有的零首先出现,然后是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]
答案 0 :(得分:1)
尚未检查高位数。
while (i <= high) {
答案 1 :(得分:1)
从快速看,您似乎只需要使用i <= high
while (i <= high)
答案 2 :(得分:1)
或者您可以使用计数排序:使用三个计数器单次扫描数组。然后将#0#1&#39; s,#2写回数组。
计数排序适用于:
计数排序为O(n) - 比任何比较排序都快。