【问题标题】: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;
}