我的荷兰国旗解决方案似乎不适用于仅包含3个元素的给定输入数组 - 0,1和2。
如果我减小了数组的大小,它就可以了。我无法识别错误。
我错过了什么吗?
class DNF{
public static void sort(int [] arr, int size, int low, int high) {
if(size == 0)
return;
int lower = 0;
int upper = size - 1;
while(lower < size && arr[lower] == low)
lower++;
while(upper >=0 && arr[upper] == high)
upper--;
int temp = 0;
int pivot;
for(pivot = lower; pivot <= upper; ) {
if(arr[pivot] == low) {
temp = arr[pivot];
arr[pivot] = arr[lower];
arr[lower] = temp;
pivot++;
lower++;
} else if(arr[pivot] == high) {
temp = arr[pivot];
arr[pivot] = arr[upper];
arr[upper] = temp;
pivot++;
upper--;
} else {
pivot++;
}
}
}
public static void main(String [] args) {
int arr [] = {0,1,2,1,2,0,1,1,1,0,0,0,1,0,2,1};
for(int i=0; i<arr.length; i++) {
System.out.print(arr[i]+" "); //0 1 2 1 2 0 1 1 1 0 0 0 1 0 2 1
}
sort(arr, arr.length, 0, 2);
System.out.println();
for(int i=0; i<arr.length; i++) {
System.out.print(arr[i]+" "); // 0 0 0 0 0 0 1 1 1 1 1 2 1 1 2 2
}
}
}
更新:以上相同的代码适用于较小尺寸的数组:http://ideone.com/bgEgCs
答案 0 :(得分:2)
错误是在arr[pivot] == high
时不得增加数据透视。
是的,我作弊:http://en.wikipedia.org/wiki/Dutch_national_flag_problem
答案 1 :(得分:1)
如果你是arr [pivot] == high,你不应该移动你的轴心点你正在切换的值可能不是你要切换的低值。你只知道鞋面现在处于正确的位置
} else if (inArray[pivot] == high) {
temp = inArray[pivot];
inArray[pivot] = inArray[upper];
inArray[upper] = temp;
pivot++; //This line is not needed
upper--;