Java 随机Hoare划分-某些指数上的错误划分
我真的尝试了一切,尝试了所有的解决方案,但仍然不起作用。似乎霍尔分区只在某些情况下有效,但偶尔我甚至不明白它在做什么。 是的,我知道这个算法是如何工作的,但是在实现方面呢?老实说,我不知道它是如何试图分割的。这是我的测试阵列:Java 随机Hoare划分-某些指数上的错误划分,java,algorithm,Java,Algorithm,我真的尝试了一切,尝试了所有的解决方案,但仍然不起作用。似乎霍尔分区只在某些情况下有效,但偶尔我甚至不明白它在做什么。 是的,我知道这个算法是如何工作的,但是在实现方面呢?老实说,我不知道它是如何试图分割的。这是我的测试阵列: 2, 30, 1, 99, 46, 33, 48, 67, 23, 76 我首先尝试实现经典算法: private int hoarePartition(int l, int r) { int pivot = array[l]; while (true)
2, 30, 1, 99, 46, 33, 48, 67, 23, 76
我首先尝试实现经典算法:
private int hoarePartition(int l, int r) {
int pivot = array[l];
while (true) {
int i = l - 1, j = r + 1;
do {
--j;
} while (array[j] > pivot);
do {
++i;
} while (array[i] < pivot);
if (i < j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
} else {
System.out.println(Arrays.toString(array));
return j;
}
}
}
private int randomizedPartition(int l, int r) {
int pivot = generator.nextInt(r - l + 1);
int temp = array[l];
array[l] = array[pivot];
array[pivot] = temp;
return hoarePartition(l, r);
}
Test cases: [2, 30, 1, 99, 46, 33, 48, 67, 23, 76]
Random Pivot | Partitioned Array | Status
0 - [ 2 ] [1, 2, 30, 99, 46, 33, 48, 67, 23, 76] OK
1 - [ 30 ] [23, 2, 1, 30, 46, 33, 48, 67, 99, 76] OK
2 - [ 1 ] [1, 30, 2, 99, 46, 33, 48, 67, 23, 76] OK
3 - [ 99 ] [76, 30, 1, 2, 46, 33, 48, 67, 23, 99] OK
4 - [ 46 ] [23, 30, 1, 33, 2, 46, 48, 67, 99, 76] OK
5 - [ 33 ] [23, 30, 1, 2, 33, 46, 48, 67, 99, 76] OK
6 - [ 48 ] [23, 30, 1, 2, 46, 33, 48, 67, 99, 76] OK
7 - [ 67 ] [23, 30, 1, 2, 46, 33, 48, 67, 99, 76] OK
8 - [ 23 ] [2, 1, 23, 99, 46, 33, 48, 67, 30, 76] OK
9 - [ 76 ] [2, 30, 1, 23, 46, 33, 48, 67, 76, 99] OK
随机轴选择应该是r-l+1。经过修改后,它终于可以工作了。您生成的数字不必在[p,q]中:
int i = (p + generator.nextInt(q)) % (q - p);
生成的数字i在[0,q-p]范围内,这显然是错误的,例如p=6,q=10
您需要的是:
int i = (p + generator.nextInt(q-p+1)); //assuming q>p here
这将在[p+0,p+q-p]=[p,q]中生成一个随机数
作为旁注,使用l,r代替p,q将更具可读性,并尝试在命名变量方面保持一致,这两种方法中的q/r具有相同的作用,没有理由使用两个不同的名称p代表pivot,r代表什么?你是如何选择pivot的?我修改了代码,使它现在更具可读性。请更新你的答案,我会接受的,因为你把我抛向了正确的方向。@愤怒,这取决于你想要独占还是包含,我假设q是独占的,但这也很好。