【发布时间】:2018-10-24 20:59:49
【问题描述】:
我正在编写一个 Java 快速排序方法。我目前的代码如下
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( );
}
快速排序方法
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 在对分区方法进行了几次不同的尝试和重写之后,我仍然无法让数组正确排序。任务是对除第一个和最后一个数字之外的整个数组进行排序。
【问题讨论】:
-
当我运行这个时,我得到了一个
StackOverflowError -
获取任何可靠的分区实现。你的错误很多。省略第一个元素,使用 n=subarray size 作为右索引,依此类推。
标签: java algorithm sorting quicksort