如何实现k-way合并排序?

时间:2017-10-31 17:20:54

标签: java arrays algorithm sorting mergesort

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

1 个答案:

答案 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