Java 我执行的荷兰国旗算法有什么问题?
给你一个有n个整数的数组,它有正整数和负整数 负整数。现在你需要用一种特殊的方式对这个数组排序。之后 负整数应该在前面,正整数应该在前面 整数应该在后面。而且相对位置不应该是 改变。 例-1-13-2答案-1-2 我的Java代码是从 包装三向分隔; 导入java.util.array; 公共类三元划分{ 公共无效排序[]输入,整数mid{ int i=0; int j=0; int n=input.length-1; 而j mid{ swapinput,j,n; n-; }否则{ j++; } } } 私人无效交换[]arr,int j,int k{ int tmp=arr[j]; arr[j]=arr[k]; arr[k]=tmp; } 公共静态无效字符串[]args{ int[]输入={-1,1,3,-2,2}; ThreewayPartition twp=新的三向分区; twp.sortinput,0; System.out.PrintLnArray.toStringinput; } } 我得到这个输出:[-1,-2,3,2,1],而不是[-1,-2,1,3,2] 您可以修改排序方法,如下所示-Java 我执行的荷兰国旗算法有什么问题?,java,algorithm,Java,Algorithm,给你一个有n个整数的数组,它有正整数和负整数 负整数。现在你需要用一种特殊的方式对这个数组排序。之后 负整数应该在前面,正整数应该在前面 整数应该在后面。而且相对位置不应该是 改变。 例-1-13-2答案-1-2 我的Java代码是从 包装三向分隔; 导入java.util.array; 公共类三元划分{ 公共无效排序[]输入,整数mid{ int i=0; int j=0; int n=input.length-1; 而j mid{ swapinput,j,n; n-; }否则{ j++; }
public void sort(int[] input, int mid) {
int n = input.length - 1;
int i=0;
int tmpvar;
while (n >= i) {
if(input[n] < mid) {
tmpvar = input[n];
System.arraycopy(input, 0, input, 1, n);
input[0] = tmpvar;
i++;
} else {
n--;
}
}
}
实现可能没有什么问题——只是荷兰国旗在原地分区。我看了一下,发现mid在排序中使用不正确。它应该用作一个值,即输入[mid] 尽管如此,荷兰国旗算法不是也不会满足问题中的约束条件: 相对位置不应改变 然而,值得一提的是,该问题是DNF算法的一个变体 因此,您正在沿着以下路线寻找一些东西:
import java.util.Arrays;
public class ThreewayPartition{
public static void sort(int[] A, int mid) {
int startIndex = 0;
for (int i = 0; i < A.length; i++) {
if (A[i] <= mid) {
int temp = A[i];
for (int j = i; j > startIndex; j--) {
A[j] = A[j-1];
}
A[startIndex] = temp;
if (temp < mid) startIndex++;
}
}
}
public static void main(String[] args) {
int[] input = {-1, 1, 3, -2, 2};
ThreewayPartition twp = new ThreewayPartition();
twp.sort(input, 0);
System.out.println(Arrays.toString(input)); // [-1, -2, 1, 3, 2]
}
}
这到底与荷兰国旗有什么关系?你的交换方法是交换元素,而不是移动。你所说的——荷兰国旗在原地的分割不稳定是什么意思?@Brayoni一些排序算法是——它们不会改变相等元素的相互位置。这里1,3,2与0相比本质上是相等的-它们是正的,但是排序会干扰它们,很酷,谢谢。我现在已经知道了。我只是对这与问题的关系感到困惑。迪内什在他的排序算法中使用了。@Brayoni,修正后的荷兰国旗排序满足了这一要求:相对位置也不应该改变?我错过了,谢谢你指出。我将在我的答复中加一条说明这一点。
import java.util.Arrays;
public class ThreewayPartition{
public static void sort(int[] A, int mid) {
int startIndex = 0;
for (int i = 0; i < A.length; i++) {
if (A[i] <= mid) {
int temp = A[i];
for (int j = i; j > startIndex; j--) {
A[j] = A[j-1];
}
A[startIndex] = temp;
if (temp < mid) startIndex++;
}
}
}
public static void main(String[] args) {
int[] input = {-1, 1, 3, -2, 2};
ThreewayPartition twp = new ThreewayPartition();
twp.sort(input, 0);
System.out.println(Arrays.toString(input)); // [-1, -2, 1, 3, 2]
}
}
import java.util.Arrays;
public class ThreewayPartition{
public static void sort(int[] A, int mid) {
for (int i = A.length - 1; i > 0; i--) {
if (A[i] <= mid && A[i - 1] > mid) {
swap(A, i, i-1);
}
}
}
private static void swap(int[] arr, int j, int k) {
int tmp = arr[j];
arr[j] = arr[k];
arr[k] = tmp;
}
public static void main(String[] args) {
int[] input = {-1, 1, 3, -2, 2};
ThreewayPartition twp = new ThreewayPartition();
twp.sort(input, 0);
System.out.println(Arrays.toString(input)); // [-1, -2, 1, 3, 2]
}
}