algorithm - 理解归并排序的递归

标签 algorithm recursion merge mergesort

我看到的大多数归并排序实现都与此类似。算法书的介绍以及我搜索的在线实现。我的递归印章并没有比搞乱斐波那契生成(这很简单)更进一步,所以也许是多重递归让我大吃一惊,但我什至无法单步执行代码并理解发生了什么,甚至在我点击之前合并函数。

它是如何逐步解决这个问题的?我应该采取一些策略或阅读以更好地理解这里的过程吗?

void mergesort(int *a, int*b, int low, int high)
{
    int pivot;
    if(low<high)
    {
        pivot=(low+high)/2;
        mergesort(a,b,low,pivot);
        mergesort(a,b,pivot+1,high);
        merge(a,b,low,pivot,high);
    }
}

和合并(尽管坦率地说,在我到达这部分之前我已经精神崩溃了)

void merge(int *a, int *b, int low, int pivot, int high)
{
    int h,i,j,k;
    h=low;
    i=low;
    j=pivot+1;

    while((h<=pivot)&&(j<=high))
    {
        if(a[h]<=a[j])
        {
            b[i]=a[h];
            h++;
        }
        else
        {
            b[i]=a[j];
            j++;
        }
        i++;
    }
    if(h>pivot)
    {
        for(k=j; k<=high; k++)
        {
            b[i]=a[k];
            i++;
        }
    }
    else
    {
        for(k=h; k<=pivot; k++)
        {
            b[i]=a[k];
            i++;
        }
    }
    for(k=low; k<=high; k++) a[k]=b[k];
}

最佳答案

合并排序:

1) 将数组分成两半
2) 对左半部分进行排序
3) 对右半部分进行排序
4) 将两半合并在一起

enter image description here

enter image description here

关于algorithm - 理解归并排序的递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19072004/

相关文章:

android - 在android中合并两个位图

c# - 什么是 "obfuscate"数值的简单但有些有效的方法?

c - C堆栈中的递归

haskell - Haskell 中涉及列表推导式、递归和删除函数的排列

python - 递归函数进入字典的字典

python - Panda 的合并返回空,不明白为什么

java - 获取 sqrt 的第 n 位数字 : getting digits that exceed the double scope

java - 为什么这个算法这么慢?

algorithm - 为什么我得到一个充满 NaN 的权重矩阵?

python - 将一个 pandas DataFrame 的副本合并到另一个 DataFrame 的每一行中?