| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 489 人关注过本帖
标题:归并排序的实现...有个地方不理解...求助
只看楼主 加入收藏
CodeWays
Rank: 2
等 级:论坛游民
帖 子:62
专家分:61
注 册:2010-2-7
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:2 
归并排序的实现...有个地方不理解...求助
程序代码:
#include <stdio.h>

#define LEN 8
int a[LEN] = { 5, 2, 4, 7, 1, 3, 2, 6 };

void merge(int start, int mid, int end)
{
    int n1 = mid - start + 1;
    int n2 = end - mid;
    int left[n1], right[n2];
    int i, j, k;

    for (i = 0; i < n1; i++)
        left[i] = a[start+i];
    for (j = 0; j < n2; j++)
        right[j] = a[mid+1+j];

    i = j = 0;
    k = start;
    while (i < n1 && j < n2)
        if (left[i] < right[j])
            a[k++] = left[i++];
        else
            a[k++] = right[j++];

    while (i < n1)
        a[k++] = left[i++];
    while (j < n2)
        a[k++] = right[j++];
}

void sort(int start, int end)
{
    int mid;
    if (start < end)
    {
        mid = (start + end) / 2;
        printf("sort  (%d-%d, %d-%d)    %d %d %d %d %d %d %d %d\n",
               start, mid, mid+1, end, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
        sort(start, mid);
        sort(mid+1, end);
        merge(start, mid, end);
        printf("merge (%d-%d, %d-%d) to %d %d %d %d %d %d %d %d\n",
               start, mid, mid+1, end, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
    }
}

int main(void)
{
    sort(0, LEN-1);

    return 0;
}

这是归并排序算法的实现,可是我不能够理解sort函数中的递归……能帮忙讲解一下吗?
搜索更多相关主题的帖子: start include 
2010-02-10 09:59
heartnheart
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:335
专家分:1096
注 册:2009-7-10
收藏
得分:20 
程序代码:
void sort(int start, int end)
{
    int mid;
    if (start < end)//归并排序,自然是先分割在合并,排序的过程发生在合并的过程中,这一点可以参看merge()的代码 
    {//这个判断条件以为若分割的每个小部分不是含有两个元素,继续分割 
        

        mid = (start + end) / 2;//把数组分割为两部分 
        printf("sort  (%d-%d, %d-%d)    %d %d %d %d %d %d %d %d\n",
               start, mid, mid+1, end, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
        
        sort(start, mid);//归并的排序前半部分 
        sort(mid+1, end);//归并的排序后半部分 
        merge(start, mid, end);//把前后合并起来。其基本情况为两个元素,决定了合并起来一定是有序的 
        
        printf("merge (%d-%d, %d-%d) to %d %d %d %d %d %d %d %d\n",
        
       start, mid, mid+1, end, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
    }//递归问题要整体思考,以上权当抛砖引玉 
}
2010-02-10 10:51
王晓明
Rank: 2
等 级:论坛游民
帖 子:40
专家分:62
注 册:2009-3-12
收藏
得分:0 
#include<stdio.h>

int jiecheng(int n)   //n!=n*(n-1)!
{
    int resault=1;
    if(n==0||n==1)
    {
        resault=1;
    }else
    {
        resault=n*jiecheng(n-1);//看懂这一步就行了
    }
    return resault;
}

int main()
{
    printf("              求阶乘\n请输入数字: ");//不考虑溢出情况,
    int n;
    scanf("%d",&n);
    int resault=jiecheng(n);
    printf("\n%d ! = %d\n",n,resault);
    return 0;
}



你可以看一下这个例子,其实原理是一样的,理解了这个,那个也是一样的
2010-02-10 10:54
快速回复:归并排序的实现...有个地方不理解...求助
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028687 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved