递归合并排序没有数组

时间:2016-02-21 22:41:47

标签: recursion merge mergesort pseudocode

这是我现在正在研究的问题,不知道如何解决。我应该把伪代码写入合并函数,但我不确定我应该做什么。我给出的内容如下:

Begin MergeSort(L[], start, stop)
   if (stop<=start) return;
   int m = (start+stop)/2;
   MergeSort(L, start, m);
   Mergesort(L, m+1, stop);
   merge(L, start, m, stop);
End MergeSort

我被告知的另一件事是,我应该找到&#34;合并(L,开始,m,停止);&#34;线。我一整天都在研究,我发现的一切都说你应该有2个阵列,分别叫做左右,分配递归线,制作:

Begin MergeSort(L[], start, stop)
   if (stop<=start) return;
   array left[];
   array right[];
   int m = (start+stop)/2;
   left=MergeSort(L, start, m);
   right=Mergesort(L, m+1, stop);
   merge(L, start, m, stop);
End MergeSort

如果我遇到了这个问题,我就可以解决它,但是我被卡住了,因为一旦我将每个子列表分成单个元素,我甚至不确定我&# 39;我应该打电话给他们,所以我不确定如何与他们合作。

我在代码方面仍然是初学者(采用C和Python的基础知识),所以请尽可能简化答案。

非常感谢您阅读此内容,我希望我能得到答案,以便了解我的目标。

1 个答案:

答案 0 :(得分:0)

MergeSort由2个函数组成:mergeSort和merge。第一个你已经写好了。所以,唯一的问题是合并功能。 由于合并排序不是空间排序算法,因此需要额外的空间来存储数据。 Bellow是合并函数的简化版本,它创建了额外的大小数组 stop - start

Begin merge(L[] array, int start, int m, int stop) 
    if (start == stop) {
        return;
    }
    int leftPos = start;
    int rightPos = m + 1;

    int curPos = start;

    L[] temp = new L[stop - start];

    while(leftPos <= m && rightPos <= stop) {
        if (array[leftPos] <= array[rightPos]) {
            temp[curPos++] = array[leftPos++];
        } else {
            temp[curPos++] = array[rightPos++];
        }
    }
    while(leftPos <= m) {
        temp[curPos++] = array[leftPos++];
    }
    while(rightPos <= stop) {
        temp[curPos++] = array[rightPos++];
    }

    for (int i = start; i <= stop; i++) {
        array[i] = temp[i - start];
    }
End merge