我需要实现一个函数,它对未排序的数组或整数执行k-way合并排序。
该函数接受两个参数,一个整数K,即" way"排序,总是2的幂。第二个参数是要排序的整数数组,其长度也是2的幂。
该函数用于返回包含已排序元素的数组。到目前为止,我知道如何实现常规合并排序。我如何修改此代码以便它实现K-way合并排序? (注意:此函数不会返回已排序的数组,我也需要帮助。它也不会接受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++;
}
}
}
答案 0 :(得分:1)
常规合并排序是双向排序。您比较阵列的第一和第二半的元素,并将最小的复制到输出数组。
对于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