我需要实现一个函数,它对未排序的数组或整数进行k路合并排序。
该函数接受两个参数,一个整数k,它是排序的“方式”,总是2的幂。第二个参数是要排序的整数数组,其长度也是2的幂。
函数的作用是返回一个包含排序元素的数组。到目前为止,我知道如何实现常规合并排序。我该如何修改这段代码,使其实现k路合并排序(注意:这个函数不返回排序数组,我也需要帮助。它也不接受k,因为它是一个常规的合并排序)
以下代码:
public class MergeSort {
public static void main(String[] args) {
}
public static void mergeSort(int[] inputArray) {
int size = inputArray.length;
if (size < 2)
return;
int mid = size / 2;
int leftSize = mid;
int rightSize = size - mid;
int[] left = new int[leftSize];
int[] right = new int[rightSize];
for (int i = 0; i < mid; i++) {
left[i] = inputArray[i];
}
for (int i = mid; i < size; i++) {
right[i - mid] = inputArray[i];
}
mergeSort(left);
mergeSort(right);
merge(left, right, inputArray);
}
public static void merge(int[] left, int[] right, int[] arr) {
int leftSize = left.length;
int rightSize = right.length;
int i = 0, j = 0, k = 0;
while (i < leftSize && j < rightSize) {
if (left[i] <= right[j]) {
arr[k] = left[i];
i++;
k++;
} else {
arr[k] = right[j];
k++;
j++;
}
}
while (i < leftSize) {
arr[k] = left[i];
k++;
i++;
}
while (j < leftSize) {
arr[k] = right[j];
k++;
j++;
}
}
}
1条答案
按热度按时间jv2fixgn1#
常规合并排序是双向排序。比较数组第一部分和第二部分的元素,并将最小的复制到输出数组。
对于k-way排序,将输入数组分成k个部分。k索引指向每个部分的第一个元素。为了有效地选择最小的元素,使用优先级队列(基于二进制堆)并在每一步从堆顶弹出最小的元素。当弹出属于第m部分的元素时,从同一部分推下一个元素(如果它仍然存在)
让数组长度为16,k=4。
第一个递归级别为从索引0..3、4..7、8..11、12..15复制的数组调用4个mergesorts。
第二个递归级别获取长度为4的数组,并为1元素数组调用4个mergesorts。
第三个递归级别获取长度为1的数组并立即返回(这样的数组被排序)。
现在在第二个递归级别将4个单元素数组合并到一个排序数组中。
现在在第一个递归级别,您将4个四元素数组合并为一个长度为16的排序数组