【问题标题】:Inplace quick sort就地快速排序
【发布时间】:2017-09-04 02:49:07
【问题描述】:

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

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

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

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

【问题讨论】:

标签: java sorting quicksort in-place


【解决方案1】:

就地排序 - 当您对原始数组进行操作,从外部提供给您,而不是创建一些新数组和以任何方式使用它们。就地排序占用 O(1) 空间,而不是使用额外数据结构时的 O(n)+

就地排序示例:

    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);
                }
            }
        }
    }

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

    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;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    相关资源
    最近更新 更多