如何实现k路合并排序?

xpszyzbs  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(372)

我需要实现一个函数,它对未排序的数组或整数进行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++;
    }
  }
}
jv2fixgn

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的排序数组

相关问题