Java 快速排序3路分区代码没有完成它所做的事情';告诉我

Java 快速排序3路分区代码没有完成它所做的事情';告诉我,java,algorithm,quicksort,partitioning,Java,Algorithm,Quicksort,Partitioning,我需要制作一个利用3向分区的快速排序方法。我使用的算法可以在这里找到,向下滚动到Dijkstra 3路分区演示。对于一些数组,例如,5 5 7 3 5 1 6 2 4 8,我的方法有效。但是,当我放置一个数组,如5 5 7 3 5 1 6 2 4 8 9 8时,我的代码不能正常工作。我得到输出:12345567898。我知道问题是什么,但我不明白为什么我的代码不能处理它。这是我的密码: import java.util.Scanner; public class QuickSortDriver

我需要制作一个利用3向分区的快速排序方法。我使用的算法可以在这里找到,向下滚动到Dijkstra 3路分区演示。对于一些数组,例如,5 5 7 3 5 1 6 2 4 8,我的方法有效。但是,当我放置一个数组,如5 5 7 3 5 1 6 2 4 8 9 8时,我的代码不能正常工作。我得到输出:12345567898。我知道问题是什么,但我不明白为什么我的代码不能处理它。这是我的密码:

import java.util.Scanner;

public class QuickSortDriver {

    public static void main(String[] args) 
    {
        Scanner scan = new Scanner(System.in);
        System.out.print("\n\nEnter array elements: ");
        String s = scan.nextLine();
        String[] token = s.split(" ");
        int[] array = new int[token.length];

        for(int i=0; i < array.length; i++)
            array[i] = Integer.parseInt(token[i]);

        quicksort(array, 0, array.length - 1);

        System.out.print("\nSorted array: ");

        for(int i = 0; i < array.length; i++)
            System.out.printf("%d ", array[i]);

        System.out.print("\n\n");
        scan.close();
    }

    public static void quicksort(int [] array, int low, int high)
    {
        //debugging: shows what the array is
        //before the while loop
        System.out.print("\n");
        for(int j = low; j <= high; j++)
            System.out.printf("%d ", array[j]);

        if(high <= low) 
            return;

        int lt = low;
        int gt = high;
        int i = low;

        while(i <= gt)
        {
            if(array[i] < array[low])
                swap(array, lt++, i++);
            else if(array[i] > array[low])
                swap(array, i, gt--);
            else
                i++;
        }

        //debugging: shows what the array is
        //after the while loop
        System.out.print("\n");
        for(int j = low; j <= high; j++)
            System.out.printf("%d ", array[j]);

        quicksort(array, low, lt -1);
        quicksort(array, gt + 1, high);
    }

    public static void swap(int array[], int i, int j)
    {
        int tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;
    }

}

i=8(结束时)lt=9 gt=8(结束时),此时应交换i和lt以及增量i。然而,事实并非如此,我也不知道为什么。我的while循环中的条件是while(i这不是错误修复。只是一些帮助来确定问题:

添加更多调试,如下所示:

    System.out.println("Part 1: " + low + " to " + (lt-1));
    System.out.println("Part 2: " + (gt+1) + " to " + high);
    quicksort(array, low, lt -1);
    quicksort(array, gt + 1, high);
    while(i <= gt)
    {
        if(array[i] < array[lt])
            swap(array, lt++, i++);
        else if(array[i] > array[lt])
            swap(array, i, gt--);
        else
            i++;
    }
如果初始输入数组是9,8,7,8,那么在第一次while迭代后,数组将是8,7,9,8。新的输出将变为

Part 1: 0 to 1
Part 2: 4 to 3
这意味着前两个项目——8,7——将在下一轮中排序。但在那之后,由于4>3,所以没有发生任何事情,因此9,8将保持错误的顺序。很明显,如果(在本例中)第2部分是“2对3”,那么一切都将正常

不幸的是,如何解决这个问题还不太清楚。在这种情况下,以下方法可能会起作用,但我怀疑Quicksort不应该起作用,在其他情况下也可能不起作用:

    quicksort(array, low, lt -1);
    quicksort(array, lt, high);

在while循环中尝试使用
lt
而不是
low
。它应该如下所示:

    System.out.println("Part 1: " + low + " to " + (lt-1));
    System.out.println("Part 2: " + (gt+1) + " to " + high);
    quicksort(array, low, lt -1);
    quicksort(array, gt + 1, high);
    while(i <= gt)
    {
        if(array[i] < array[lt])
            swap(array, lt++, i++);
        else if(array[i] > array[lt])
            swap(array, i, gt--);
        else
            i++;
    }
while(i数组[lt])
交换(数组,i,gt--);
其他的
i++;
}
我确信它完全按照它所说的做了。更有可能的是,你让它做了错误的事情。