| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1883 人关注过本帖
标题:合并排序,我的思路很清晰
只看楼主 加入收藏
潺潺的小河
Rank: 2
等 级:论坛游民
帖 子:29
专家分:10
注 册:2019-3-2
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:4 
合并排序,我的思路很清晰
程序代码:
#include"stdio.h"
#include"stdlib.h"
#define N 8
void Merge(int A[],int first,int mind,int end);
void Merge_sorted(int A[],int first,int end);

void main()
{
    int A[N]={5,2,4,7,1,3,2,6};
    int i;
    Merge_sorted(A,0,N-1);
    for(i=0;i<N;i++)
    {
       printf("\t%d",A[i]);
    }
}
void Merge_sorted(int A[],int first,int end)
{
    int mind;
    if(first<end)
    {
         mind=(end-first)/2;
         Merge_sorted(A,first,mind);
         Merge_sorted(A,mind+1,end);
         Merge(A,first,mind,end);
    }
}
void Merge(int A[],int first,int mind,int end)
{
     int i,k=0,n=0;
     int *L,*R;
     L=(int*)malloc(sizeof(int)*(mind-first+1));
     R=(int*)malloc(sizeof(int)*(end-mind+1));
     //数组中的元素转移;
     for(i=first;i<mind;i++,k++)
     {
         *(L+k)=A[i];
     }
     k=0;
     for(i=mind+1;i<end;i++,k++)
     {
         *(R+k)=A[i];
     }
     //合并两数组
     k=0;
     for(i=first;i<end;i++)
     {
         if(*(L+k)<=*(R+n))
         {
             A[i]=*(L+k);
             k++;
         }
         else
         {
             A[i]=*(L+n);
             n++;
         }
     }
     //释放空间
     free(L);free(R);
}


但问题不知道 :哪里出错了
搜索更多相关主题的帖子: 合并 void int first end 
2019-03-18 19:25
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
收藏
得分:20 
#include"stdio.h"
#include"stdlib.h"
#define N 8
void Merge(int A[],int first,int mind,int end);
void Merge_sorted(int A[],int first,int end);

//整个数组分为前后两部分
//递归对两个部分排序
//合并:将数组前后两部分分到临时数组L和R中
//      比较L和R中的数字,较小的放回原数组
//      若其中一个数组已遍历完,直接放另一个数组的数字
void main()
{
    int A[N]={5,2,4,7,1,3,2,6};
    int i;
    Merge_sorted(A,0,N-1);
    for(i=0;i<N;i++)
    {
       printf("\t%d",A[i]);
    }
}
void Merge_sorted(int A[],int first,int end)
{
    int mind;
    if(first<end)
    {
         mind=(end+first)/2;    //+
         Merge_sorted(A,first,mind);
         Merge_sorted(A,mind+1,end);
         Merge(A,first,mind,end);
    }
}
void Merge(int A[],int first,int mind,int end)
{
     int i,k=0,n=0;
     int *L,*R;
     L=(int*)malloc(sizeof(int)*(mind-first+1));
     R=(int*)malloc(sizeof(int)*(end-mind));   //
     //数组中的元素转移;
     for(i=first;i<=mind;i++,k++)
     {
         *(L+k)=A[i];
     }
     k=0;
     for(i=mind+1;i<=end;i++,k++)   //
     {
         *(R+k)=A[i];
     }
     //合并两数组
     k=0;
     for(i=first;i<=end;i++)   //
     {
         if(k>=(mind-first+1)){
                A[i]=*(R+n);
                n++;
         }else if(n>=(end-mind)){
                A[i]=*(L+k);
                k++;
         }else if(k<(mind-first+1) && n<(end-mind))
         {
            if(*(L+k)<=*(R+n))
             {
                 A[i]=*(L+k);
                 k++;
             }
             else
             {
                 A[i]=*(R+n);    //
                 n++;
             }
         }
     }
     //释放空间
     free(L);free(R);
}
2019-03-18 21:55
潺潺的小河
Rank: 2
等 级:论坛游民
帖 子:29
专家分:10
注 册:2019-3-2
收藏
得分:0 
回复 2楼 word123
感谢提醒!
2019-03-19 13:22
潺潺的小河
Rank: 2
等 级:论坛游民
帖 子:29
专家分:10
注 册:2019-3-2
收藏
得分:0 
回复 2楼 word123
     R=(int*)malloc(sizeof(int)*(end-mind));//更新部分end-mind+1

这一部分 我理解不到 为什么不(end-mind+1) 在N=2的情况下,我就觉感有问题。
2019-03-19 13:55
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
收藏
得分:0 
L和R不是分别保存数组的左右两部分吗,左边大小mind-first+1   右边大小end-mind  加起来就是end-first+1,刚好是数组的大小


如果N=2 => first=0 mind=0 end=1
前面first到mind mind-first+1只有一个数
后面mind到end  end-mind也只有一个数
2019-03-20 16:01
快速回复:合并排序,我的思路很清晰
数据加载中...
 
   



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

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