我正在编写一个程序来测试sort函数是否正确地对程序进行排序。我必须让它测试快速排序和合并排序方法。此外,它必须询问用户他们想要测试哪种方法并制作一组随机对象。为什么我的程序不能正常运行?它只是为了快速排序而吐出相同的数组,并随机重新排列它们以进行合并排序。问题是我的排序方法还是我的测试方法?有人请帮忙。
import java.util.Random;
import java.util.Scanner;
public class sortArrays {
public static void main (String[] args)
{
Random gen = new Random();
int[] a = new int[20];
Scanner reader = new Scanner(System.in);
String choice;
int left = a[0];
int right = a[19];
int[] buffer = new int [a.length];
for (int i = 0; i < a.length; i++)
a[i] = gen.nextInt(100);
printArray(a);
System.out.println("Type quick to test the quick sort method.");
System.out.println("Type merge to test the merge sort method.");
choice = reader.nextLine();
if (choice.equals("quick"))
quickSort(a, left, right);
else if (choice.equals("merge"))
mergeSort(a, buffer, 0, 9, 19);
printArray(a);
}
private static void printArray(int[] a)
{
for(int i : a)
System.out.print(i + " ");
System.out.println("");
}
private static void quickSort (int[] a, int left, int right)
{
if (left >= right) return;
int i = left;
int j = right;
int pivotValue = a[(left + right) / 2];
while (i < j)
{
while (a[i] < pivotValue) i++;
while (pivotValue < a[j]) j--;
if (i <= j)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
i++;
j--;
}
}
quickSort(a, left, j);
quickSort(a, i, right);
}
private static void mergeSort(int[] a, int[] copyBuffer, int low, int middle, int high)
{
int i1 = low, i2 = middle + 1;
for(int i = low; i <= high; i++)
{
if(i1 > middle)
copyBuffer [i] = a[i2++];
else if(i2 > high)
copyBuffer[i] = a[i1++];
else if(a[i1] < a[i2])
copyBuffer[i] = a[i1++];
else
copyBuffer[i] = a[i2++];
}
for(int i = low; i <= high; i++)
a[i] = copyBuffer[i];
}
}
答案 0 :(得分:4)
嗯,你的printArray()
看起来还不错,但有一点可以立刻突出:
您传递给quickSort()
的初始参数不正确。你有:
int[] a = new int[20];
...
int left = a[0];
int right = a[19];
...
quickSort(a, left, right);
您正在初始化left
和right
至0
,因此您最终会调用quickSort(a, 0, 0)
(不是您想要的)。你的意思可能是这样做,因为left
和right
拥有索引:
int left = 0;
int right = 19;
或者简单地说:
quickSort(a, 0, 19);
至于你的mergeSort()
,实施工作很简单。您似乎已经实现了“合并”操作(算法的基本部分),但没有实现“合并排序”整体算法。您可能需要查看Mergesort in Java(例如)或Merge Sort(总体概述)。
顺便说一句,您可能希望指定a.length - 1
而不是19
,这样您就可以更改a
的大小,而无需修改其他代码(同样适用于9
您传递给mergeSort()
,但这是没有实际意义的,因为一旦您完全实施该算法,您将看到它是不必要的。)