Java 快速排序3路分区代码没有完成它所做的事情';告诉我
我需要制作一个利用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。我知道问题是什么,但我不明白为什么我的代码不能处理它。这是我的密码: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
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++;
}
我确信它完全按照它所说的做了。更有可能的是,你让它做了错误的事情。