我正在编写一个Java quicksort方法。我的代码目前如下
public class Quicksort {
public static void main(String[ ] args)
{
final String BLANKS = " "; // A String of two blanks
int i; // Array index
int[ ] data = { 1000, 80, 10, 50, 70, 60, 90, 20, 30, 40, 0, -1000 };
// Print the array before sorting:
System.out.println("Here is the entire original array:");
for (i = 0; i < data.length; i++)
System.out.print(data[i] + BLANKS);
System.out.println( );
// Sort the numbers, and print the result with two blanks after each number.
quicksort(data, 1, data.length-2);
System.out.println("I have sorted all but the first and last numbers.");
System.out.println("The numbers are now:");
for (i = 0; i < data.length; i++)
System.out.print(data[i] + BLANKS);
System.out.println( );
}
Quicksort方法
public static void quicksort(int[ ] data, int first, int n)
{
int pivotIndex; // Array index for the pivot element
int n1; // Number of elements before the pivot element
int n2; // Number of elements after the pivot element
if (n > 1)
{
// Partition the array, and set the pivot index.
pivotIndex = partition(data, first, n);
// Compute the sizes of the two pieces.
n1 = pivotIndex - first;
n2 = n - n1 - 1;
// Recursive calls will now sort the two pieces.
quicksort(data, first, n1);
quicksort(data, pivotIndex + 1, n2);
}
}
分区方法
private static int partition(int[ ] data, int first, int n){
int low = first;
int high = n;
int pivot = data[low];
while(low < high){
low ++;
while(low <= high && data[low] < pivot){
low ++;
}
while(high >= low && data[high] > pivot){
high--;
}
if(low<=n && low < high){
int temp = data[low];
data[low] = data[high];
data[high] = temp;
}
}
return low;
}//end partition
}//end class
当我目前运行该程序时,我得到的结果 1000 80 0 10 70 60 90 20 30 40 50 -1000 经过几次不同的尝试和重写分区方法后,我仍然无法正确排序数组。任务是将整个数组排序,除了第一个和最后一个数字。
答案 0 :(得分:1)
Quicksort方法
public static void quicksort(int[ ] data, int first, int last){
if (last-first > 1){
// Partition the array, and set the pivot index.
pivotIndex = partition(data, first, n);
//n1 = pivotIndex - first; //problem is here
// n2 = n - n1 - 1; // and here
// Recursive calls will now sort the two pieces.
quicksort(data, first, pivotIndex);
quicksort(data, pivotIndex + 1, last);
}
}
分区方法 实际的Hoare分区。
private static int partition(int[ ] data, int first, int last){
int low = first-1;
int high = n+1;
int pivot = data[low];
while (true) {
do {
low++;
}
while (data[low] < pivot);
do {
high--;
}
while (data[j] > pivot);
if (low < high) {
int temp = data[low];
data[low] = data[high];
data[high] = temp;
} else {
return high;
}
}
}
我已经更新了你现在需要调用的两个函数。
int[ ] data = { 1000, 80, 10, 50, 70, 60, 90, 20, 30, 40, 0, -1000 };
quicksort(data, 1, data.length-2);