就地快速排序

时间:2017-04-08 20:01:01

标签: java sorting quicksort in-place

  

编写一个java程序,使用“就地”Quicksort算法对整数列表进行排序。

     

每次使用java.util.Random类随机生成列表。   允许用户选择数组的大小。程序应显示使用不同的轴选项对该大小的数组进行排序的结果。特别是,尝试这4个选择 -

     

第一个元素作为枢轴
  随机选择枢轴元素
  选择3个随机选择的元素的中位数作为枢轴
  第一中心和最后一个元素的中位数(书籍技巧)。

请不要给我实施,因为我想尝试自己。我想知道什么是现场快速排序?它与常规quiksort有何不同?这是常规快速排序吗?我真的很困惑。我想有人提供pusedocode或用简单的英语解释也会有所帮助。

1 个答案:

答案 0 :(得分:2)

就地排序 - 当您对原始数组进行操作时,从外部提供给您,而不是创建一些新数组< / strong>并以任何方式使用它们。在使用其他数据结构时,就地排序需要O(1)空间,而不是O(n)+

inplace sort的示例:

    public static void simpleBubbleSort(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            for (int j = 1; j < arr.length; j++) {
                if (arr[j - 1] > arr[j]) {
                    swap(arr, j - 1, j);
                }
            }
        }
    }

与沿途创建数组的Merge排序相反,最后将它们组合在一起并返回原始(给予我们)数组,而不是包含结果的数组。

    public static int[] mergeSort(int[] arr) {
        if (arr.length < 2) return arr;

        int mid = arr.length / 2;
        int[] left = new int[mid];
        int[] right = new int[mid + arr.length % 2];

        int j = 0;
        for (int i = 0; i < arr.length; i++) {
            if (i < mid) {
                left[i] = arr[i];
            } else {
                right[j++] = arr[i];
            }
        }
        // keeps going until there's 1 element in each array[]
        return mergeReturn(mergeSort(left), mergeSort(right));
    }

    private static int[] mergeReturn(int[] leftArr, int[] rightArr) {
        int leftPointer = 0, rightPointer = 0, combinedSize = leftArr.length + rightArr.length;
        int[] merged = new int[combinedSize];

        for (int i = 0; i < combinedSize; i++) {
            if (leftPointer < leftArr.length && rightPointer < rightArr.length) {
                if (leftArr[leftPointer] < rightArr[rightPointer]) {
                    merged[i] = leftArr[leftPointer++];
                } else {
                    merged[i] = rightArr[rightPointer++];
                }
            } else if (leftPointer < leftArr.length) { // adding the last element
                merged[i] = leftArr[leftPointer++];
            } else {
                merged[i] = rightArr[rightPointer++];
            }
        }
        return merged;
    }