Java 我执行的荷兰国旗算法有什么问题?

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++; }

给你一个有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]

您可以修改排序方法,如下所示-

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]
    }
}