编写一个java程序,使用“就地”Quicksort算法对整数列表进行排序。
每次使用java.util.Random类随机生成列表。 允许用户选择数组的大小。程序应显示使用不同的轴选项对该大小的数组进行排序的结果。特别是,尝试这4个选择 -
第一个元素作为枢轴
随机选择枢轴元素
选择3个随机选择的元素的中位数作为枢轴
第一中心和最后一个元素的中位数(书籍技巧)。
请不要给我实施,因为我想尝试自己。我想知道什么是现场快速排序?它与常规quiksort有何不同?这是常规快速排序吗?我真的很困惑。我想有人提供pusedocode或用简单的英语解释也会有所帮助。
答案 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;
}