如何实现nMergeSort?

时间:2016-01-31 16:52:37

标签: arrays sorting merge mergesort partition

我必须实现nMerge,所以我需要合并分为N个子数组的数组。这是nMergeSort:

void nMergeSort(int arr[],int n, int low, int high){

    int *L,i,a;

    if(low < high){     

        L=SPLIT(k,low,high);        
        for(i=0;i<=n;i++){

            nMergeSort(arr,n,L[i],L[i+1]-1);            
        }

        nMerge(arr[],L[],n,low,high);       
    }

}

SPLIT是一个函数,它创建一个数组,其中包含N个子阵列的第一个元素的位置(至少我认为是这样)。如何实现nMerge方法?我卡住了,我不能再继续了。

1 个答案:

答案 0 :(得分:0)

n路合并的一个简单实现是对n个有序组的第一个元素进行n-1次比较,找到最小的元素/组,然后输出该元素并从中获取下一个元素组。另一种方法是创建和更新某种类型的最小堆,以跟踪哪个组包含当前最小元素。

在n路合并期间,当到达其中一个组的末尾时,它将变为(n-1)-way合并,然后是(n-2)-way merge,依此类推。如果只剩下一个组,则复制它,并完成该组组的n路合并。

为了实现nMerge,维护了一组变量。对于每个组,通常具有当前索引或指针,以及用于组中剩余元素数量的结束索引或指针或向下计数器。这些可以是单独的数组或结构数组。根据组的当前元素对阵列进行重新排序,使得array [0]包含具有最小当前元素的组的组信息。当一个组到达它的末尾时,则数组[0]与数组[组数 - 1]交换,并且组数减少。当组数减少到1时,最后一组的其余部分将被复制。