| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 327 人关注过本帖
标题:求教关于归并排序MergeSort()的问题
只看楼主 加入收藏
dhz662820909
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2013-10-28
结帖率:40%
收藏
已结贴  问题点数:20 回复次数:1 
求教关于归并排序MergeSort()的问题
#include<stdio.h>
#include<stdlib.h>
void InputArray(float *p,int n);
void C_MergeSort(float *p1,int low,int middle,int high,float *p2);
void MergeSort(float *p1,int low,int high,float *p2);
int main(void)
{
    float *p1=NULL,*p2=NULL;
    int i,n;
   
    printf("Enter n:");
    scanf("%d",&n);
   
    p1=(float*)malloc(n*sizeof(float));
    p2=(float*)calloc(n,sizeof(float));
    if(p1==NULL)
    {
               printf("No enough memory!\n");
               exit(1);
    }
    if(p2==NULL)
    {
               printf("No enough memory!\n");
               exit(1);
    }
   
    InputArray(p1,n);
        
    MergeSort(p1,0,n-1,p2);

    for(i=0;i<n;i++)
    printf("%f ",p2[i]);
    printf("\n");
    for(i=0;i<n;i++)
    printf("%f ",p2[i]);
    printf("\n");   
   
    free(p1);
    free(p2);
   
    system("pause");
    return(0);
}
void InputArray(float *p,int n)
{
     int i;  
     printf("Enter an array whose length is %d:\n",n);
     for(i=0;i<n;i++)
     {
                     scanf("%f",&p[i]);
     }
}
void C_MergeSort(float *p1,int low,int middle,int high,float *p2)  
{
     int i=low,j=middle+1,k=low;
     while(i<=middle && j<=high)
     {
                if(p1[i]>p1[j])
                {
                               p2[k++]=p1[j++];
                               while(j==high+1 && i<=middle)
                               {
                                        p2[k++]=p1[i++];
                               }
                }
                else
                {
                    p2[k++]=p1[i++];
                    while(i==middle+1 && j<=high)
                    {
                             p2[k++]=p1[j++];
                    }
                }
     }
     for(i=0;i<=high;i++)    //关键
     p1[i]=p2[i];         
}
void MergeSort(float *p1,int low,int high,float *p2)
{
     int middle=(low+high)/2;
     printf("low=%d,middle=%d,high=%d\n",low,middle,high);  //打印,看看规律
     if(low<high)
     {
                 MergeSort(p1,low,middle,p2);        //注意MergeSort和C_MergeSort的顺序
                 MergeSort(p1,middle+1,high,p2);
                 C_MergeSort(p1,low,middle,high,p2);
     }
}
最后一个部分,即MergeSort是参考书上的

我有一个疑问,用例子说明
{5, 3, 6, 1}。
MergeSort分裂为{5, 3}和{6, 1}
MergeSort分裂{5, 3}为{5}, {3};分裂{6, 1}为{6}, {1}
现在递归已经到头,因为继续分的话low>high
所以运行C_MergeSort,合并{5}, {3}为{3, 5};合并{6}, {1}为{1, 6}
退到上一层递归,合并{3, 5}和{1, 6}为{1, 3, 5, 6}。

问题是,在MergeSort中,当运行了C_MergeSort,C_MergeSort的后面什么都没有了,不是直接下去了吗?还有反复调用函数啊?
还有,在MergeSort中,当运行了MergeSort(p1,low,middle,p2),要等到它执行完,才轮到MergeSort(p1,middle+1,high,p2)的吧?

程序是可以用的,大家帮忙解释下,我非计算机专业,但是对这个感兴趣。
搜索更多相关主题的帖子: include memory middle Enter 
2013-12-12 17:27
so_love
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:7
帖 子:812
专家分:4151
注 册:2013-11-25
收藏
得分:20 
没太懂。。、。

一花一世界、一叶一追寻、片片花叶落、情系何人身。
2013-12-12 19:27
快速回复:求教关于归并排序MergeSort()的问题
数据加载中...
 
   



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

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