测试排序数组方法

时间:2014-03-19 00:01:51

标签: java arrays quicksort mergesort

我正在编写一个程序来测试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];
    }


}

1 个答案:

答案 0 :(得分:4)

嗯,你的printArray()看起来还不错,但有一点可以立刻突出:

您传递给quickSort()的初始参数不正确。你有:

int[] a = new int[20];
...
int left = a[0];
int right = a[19];
...
quickSort(a, left, right);

您正在初始化leftright0,因此您最终会调用quickSort(a, 0, 0)(不是您想要的)。你的意思可能是这样做,因为leftright拥有索引

int left = 0;
int right = 19;

或者简单地说:

quickSort(a, 0, 19);

至于你的mergeSort(),实施工作很简单。您似乎已经实现了“合并”操作(算法的基本部分),但没有实现“合并排序”整体算法。您可能需要查看Mergesort in Java(例如)或Merge Sort(总体概述)。

顺便说一句,您可能希望指定a.length - 1而不是19,这样您就可以更改a的大小,而无需修改其他代码(同样适用于9您传递给mergeSort(),但这是没有实际意义的,因为一旦您完全实施该算法,您将看到它是不必要的。)