选择和快速排序不起作用

时间:2016-05-04 17:45:24

标签: java sorting selection quicksort

我正在创建一个程序,比较许多种类以及完成每种种类和其他种类所需的时间。我在选择和快速排序方面遇到问题。以下是选择排序代码:

public class SelectionSort {
    public static void SelectionSort(int[] list) {
        Selection(list, 0, list.length - 1); // Sort the entire list
    }

    public static void Selection(int[] list, int low, int high) {
        if (low < high) {
            // Find the smallest number and its index in list(low .. high)
            int indexOfMin = low;
            int min = list[low];
            for (int i = low + 1; i <= high; i++) {
                if (list[i] < min) {
                    min = list[i];
                    indexOfMin = i;
                }
            }

            // Swap the smallest in list(low .. high) with list(low)
            list[indexOfMin] = list[low];
            list[low] = min;

            // Sort the remaining list(low+1 .. high)
          //  Selection(list, (low + 1), high);
        }
    }


}

最后一行在我的程序中不起作用。我不知道为什么。

这是主要代码:

public Main()
    {

        Integer[] randH = new Integer[50000];
        int i=0;
        while (i < randH.length)
        {randH[i] = (int)(Math.random() * 50000);
            i++;}

        Integer[] randH2 = new Integer[100000];
        i=0;
        while (i < randH2.length)
        {randH2[i] = (int)(Math.random() * 100000);
            i++;}

        Integer[] randH3 = new Integer[150000];
        i=0;
        while (i < randH3.length)
        {randH3[i] = (int)(Math.random() * 150000);
            i++;}

        Integer[] randH4 = new Integer[200000];
        i=0;
        while (i < randH4.length)
        {randH4[i] = (int)(Math.random() * 200000);
            i++;}

        Integer[] randH5 = new Integer[250000];
        i=0;
        while (i < randH5.length)
        {randH5[i] = (int)(Math.random() * 250000);
            i++;}

        Integer[] randH6 = new Integer[300000];
        i=0;
        while (i < randH6.length)
        {randH6[i] = (int)(Math.random() * 300000);
            i++;}

        int[] rand = new int[50000];
        i=0;
        while (i < rand.length)
        {rand[i] = (int)(Math.random() * 50000);
            i++;}

        int[] rand1 = new int[100000];
        i=0;
        while (i < rand1.length)
        {rand1[i] = (int)(Math.random() * 100000);
            i++;}

        int[] rand2 = new int[150000];
        i=0;
        while (i < rand2.length)
        {rand2[i] = (int)(Math.random() * 150000);
            i++;}

        int[] rand3 = new int[200000];
        i=0;
        while (i < rand3.length)
        {rand3[i] = (int)(Math.random() * 200000);
            i++;}

        int[] rand4 = new int[250000];
        i=0;
        while (i < rand4.length)
        {rand4[i] = (int)(Math.random() * 250000);
            i++;}

        int[] rand5 = new int[300000];
        i=0;
        while (i < rand5.length)
        {rand5[i] = (int)(Math.random() * 300000);
            i++;}

        //Bubble Sort

        long startTime = System.currentTimeMillis();
        new BubbleSort(rand);
        long endTime = System.currentTimeMillis();
        long executionTime = endTime - startTime;

        long startTime1B = System.currentTimeMillis();
        new BubbleSort(rand1);
        long endTime1B = System.currentTimeMillis();
        long executionTime1B = endTime1B - startTime1B;

        long startTime2B = System.currentTimeMillis();
        new BubbleSort(rand2);
        long endTime2B = System.currentTimeMillis();
        long executionTime2B = endTime2B - startTime2B;

        long startTime3B = System.currentTimeMillis();
        new BubbleSort(rand3);
        long endTime3B = System.currentTimeMillis();
        long executionTime3B = endTime3B - startTime3B;

        long startTime4B = System.currentTimeMillis();
        new BubbleSort(rand4);
        long endTime4B = System.currentTimeMillis();
        long executionTime4B = endTime4B - startTime4B;

        long startTime5B = System.currentTimeMillis();
        new BubbleSort(rand5);
        long endTime5B = System.currentTimeMillis();
        long executionTime5B = endTime5B - startTime5B;

        //Selection Sort

        long startTime1S = System.currentTimeMillis();
        SelectionSort.SelectionSort(rand);
        long endTime1S = System.currentTimeMillis();
        long executionTime1S = endTime1S - startTime1S;

        long startTime2S = System.currentTimeMillis();
        SelectionSort.SelectionSort(rand1);
        long endTime2S = System.currentTimeMillis();
        long executionTime2S = endTime2S - startTime2S;

        long startTime3S = System.currentTimeMillis();
        SelectionSort.SelectionSort(rand2);
        long endTime3S = System.currentTimeMillis();
        long executionTime3S = endTime3S - startTime3S;

        long startTime4S = System.currentTimeMillis();
        SelectionSort.SelectionSort(rand3);
        long endTime4S = System.currentTimeMillis();
        long executionTime4S = endTime4S - startTime4S;

        long startTime5S = System.currentTimeMillis();
        SelectionSort.SelectionSort(rand4);
        long endTime5S = System.currentTimeMillis();
        long executionTime5S = endTime5S - startTime5S;

        long startTime6S = System.currentTimeMillis();
        SelectionSort.SelectionSort(rand5);
        long endTime6S = System.currentTimeMillis();
        long executionTime6S = endTime6S - startTime6S;

        //Heap Sort

        long startTime1H = System.currentTimeMillis();
        HeapSort.HeapSort(randH);
        long endTime1H = System.currentTimeMillis();
        long executionTime1H = endTime1H - startTime1H;

        long startTime2H = System.currentTimeMillis();
        HeapSort.HeapSort(randH2);
        long endTime2H = System.currentTimeMillis();
        long executionTime2H = endTime2H - startTime2H;

        long startTime3H = System.currentTimeMillis();
        HeapSort.HeapSort(randH3);
        long endTime3H = System.currentTimeMillis();
        long executionTime3H = endTime3H - startTime3H;

        long startTime4H = System.currentTimeMillis();
        HeapSort.HeapSort(randH4);
        long endTime4H = System.currentTimeMillis();
        long executionTime4H = endTime4H - startTime4H;

        long startTime5H = System.currentTimeMillis();
        HeapSort.HeapSort(randH5);
        long endTime5H = System.currentTimeMillis();
        long executionTime5H = endTime5H - startTime5H;

        long startTime6H = System.currentTimeMillis();
        HeapSort.HeapSort(randH6);
        long endTime6H = System.currentTimeMillis();
        long executionTime6H = endTime6H - startTime6H;

        //Radix Sort

        long startTime1R = System.currentTimeMillis();
        RadixSort.RadixSort(rand);
        long endTime1R = System.currentTimeMillis();
        long executionTime1R = endTime1R - startTime1R;

        long startTime2R = System.currentTimeMillis();
        RadixSort.RadixSort(rand1);
        long endTime2R = System.currentTimeMillis();
        long executionTime2R = endTime2R - startTime2R;

        long startTime3R = System.currentTimeMillis();
        RadixSort.RadixSort(rand2);
        long endTime3R = System.currentTimeMillis();
        long executionTime3R = endTime3R - startTime3R;

        long startTime4R = System.currentTimeMillis();
        RadixSort.RadixSort(rand3);
        long endTime4R = System.currentTimeMillis();
        long executionTime4R = endTime4R - startTime4R;

        long startTime5R = System.currentTimeMillis();
        RadixSort.RadixSort(rand4);
        long endTime5R = System.currentTimeMillis();
        long executionTime5R = endTime5R - startTime5R;

        long startTime6R = System.currentTimeMillis();
        RadixSort.RadixSort(rand5);
        long endTime6R = System.currentTimeMillis();
        long executionTime6R = endTime6R - startTime6R;

        //Quick Sort

        long startTime1Q = System.currentTimeMillis();
        QuickSort.QuickSort(rand);
        long endTime1Q = System.currentTimeMillis();
        long executionTime1Q = endTime1Q - startTime1Q;

        long startTime2Q = System.currentTimeMillis();
        QuickSort.QuickSort(rand1);
        long endTime2Q = System.currentTimeMillis();
        long executionTime2Q = endTime2Q - startTime2Q;

        long startTime3Q = System.currentTimeMillis();
        QuickSort.QuickSort(rand2);
        long endTime3Q = System.currentTimeMillis();
        long executionTime3Q = endTime3Q - startTime3Q;

        long startTime4Q = System.currentTimeMillis();
        QuickSort.QuickSort(rand3);
        long endTime4Q = System.currentTimeMillis();
        long executionTime4Q = endTime4Q - startTime4Q;

        long startTime5Q = System.currentTimeMillis();
        QuickSort.QuickSort(rand4);
        long endTime5Q = System.currentTimeMillis();
        long executionTime5Q = endTime5Q - startTime5Q;

        long startTime6Q = System.currentTimeMillis();
        QuickSort.QuickSort(rand5);
        long endTime6Q = System.currentTimeMillis();
        long executionTime6Q = endTime6Q - startTime6Q;

        //Merge Sort

        long startTime1M = System.currentTimeMillis();
        MergeSort.MergeSort(rand);
        long endTime1M = System.currentTimeMillis();
        long executionTime1M = endTime1M - startTime1M;

        long startTime2M = System.currentTimeMillis();
        MergeSort.MergeSort(rand1);
        long endTime2M = System.currentTimeMillis();
        long executionTime2M = endTime2M - startTime2M;

        long startTime3M = System.currentTimeMillis();
        MergeSort.MergeSort(rand2);
        long endTime3M = System.currentTimeMillis();
        long executionTime3M = endTime3M - startTime3M;

        long startTime4M = System.currentTimeMillis();
        MergeSort.MergeSort(rand3);
        long endTime4M = System.currentTimeMillis();
        long executionTime4M = endTime4M - startTime4M;

        long startTime5M = System.currentTimeMillis();
        MergeSort.MergeSort(rand4);
        long endTime5M = System.currentTimeMillis();
        long executionTime5M = endTime5M - startTime5M;

        long startTime6M = System.currentTimeMillis();
        MergeSort.MergeSort(rand5);
        long endTime6M = System.currentTimeMillis();
        long executionTime6M = endTime6M - startTime6M;







        //headers for the table
        String[] columns = new String[] {
               "Array Size", "Selection Sort", "Bubble Sort", "Merge Sort", "Quick Sort", "Heap Sort", "Radix Sort"
        };

        //actual data for the table in a 2d array
        Object[][] data = new Object[][] {
                {50000, executionTime1S, executionTime, executionTime1M, executionTime1Q, executionTime1H, executionTime1R},
                {100000, executionTime2S, executionTime1B, executionTime2M, executionTime2Q, executionTime2H, executionTime2R },
                {150000, executionTime3S, executionTime2B, executionTime3M, executionTime3Q, executionTime3H, executionTime3R },
                {200000, executionTime4S, executionTime3B, executionTime4M, executionTime4Q, executionTime4H, executionTime4R },
                {250000, executionTime5S, executionTime4B, executionTime5M, executionTime5Q, executionTime5H, executionTime5R },
                {300000, executionTime6S, executionTime5B, executionTime6M, executionTime6Q, executionTime6H, executionTime6R },


        };

这是快速排序。此行不起作用:QuickSort(list,pivotIndex + 1,last);

public class QuickSort {
    public static void QuickSort(int[] list) {
        QuickSort(list, 0, list.length - 1);
    }

    private static void QuickSort(int[] list, int first, int last) {
        if (last > first) {
            int pivotIndex = partition(list, first, last);
            QuickSort(list, first, pivotIndex - 1);
//            QuickSort(list, pivotIndex + 1, last);
        }
    }

    /** Partition the array list[first..last] */
    private static int partition(int[] list, int first, int last) {
        int pivot = list[first]; // Choose the first element as the pivot
        int low = first + 1; // Index for forward search
        int high = last; // Index for backward search

        while (high > low) {
            // Search forward from left
            while (low <= high && list[low] <= pivot)
                low++;

            // Search backward from right
            while (low <= high && list[high] > pivot)
                high--;

            // Swap two elements in the list
            if (high > low) {
                int temp = list[high];
                list[high] = list[low];
                list[low] = temp;
            }
        }

        while (high > first && list[high] >= pivot)
            high--;

        // Swap pivot with list[high]
        if (pivot > list[high]) {
            list[first] = list[high];
            list[high] = pivot;
            return high;
        }
        else {
            return first;
        }
    }


}

1 个答案:

答案 0 :(得分:0)

对于插入排序 - 您的堆栈溢出。字面意思。

您不能对这些列表大小使用递归实现,因为这意味着堆栈大小与输入呈线性关系。

请参阅What is the maximum depth of the java call stack?

如果你想测试具有如此大量元素的列表,你需要迭代地实现它。

您的主要代码被搞砸了。您只生成两组列表,然后按照第一个算法对每个列表进行完美排序,然后其他算法将排序列表作为输入。

这可能已经在你的 Quicksort 实现中触发了堆栈溢出,就像Quicksort一样,当选择不是随机的pivot元素时,当列表完全排序时会遇到绝对最坏的情况按升序或降序排列。

如果你真的想强调算法(并且导致堆栈溢出Quicksort),不要只测试随机数组,而是测试列表的两个边缘情况已经按降序或升序排序。

对于大多数搜索算法,这些情况中的任何一种都会触发最坏情况的行为,而另一种情况通常会触发最佳情况。 (或两者都是最糟糕的情况,也可能发生!)