| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 627 人关注过本帖
标题:这个递归排序的程序编译正确,结果怎么不对,求高手帮忙看下。
只看楼主 加入收藏
z627724978
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2013-2-28
结帖率:0
收藏
已结贴  问题点数:20 回复次数:15 
这个递归排序的程序编译正确,结果怎么不对,求高手帮忙看下。
程序代码:
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
void  wrt(int key[], int sz);
void  mergesort(int key[], int n);
void  merge(int a[], int b[], int c[], int m, int n);


void merge(int a[],int b[],int c[], int m,int n)
{
    int i=0,j=0,k=0;
    while(i<m && j<n)
        if(a[i] < b[i])
            c[k++]=a[i++];
        else
            c[k++]=b[j++];
        while (i<m)
            c[k++]=a[i++];
        while (j<n)
            c[k++] = b[j++];
}
void mergesort(int key[],int n)
{
    int j,k,m,*w;
    for(m = 1; m < n; m *= 2)
        ;
    if (n < m)
    {
        printf("ERROR:Array size not apower of 2 - bye!\n");
        exit(1);
    }
    w = calloc(n, sizeof(int));
    assert(w != NULL);
    for (k = 1; k < n; k *=2)
    {
        for(j = 0; j < n - k; j += 2*k)
            merge(key + j, key + j + k, w + j, k, k);

        for (j = 0; j < n; ++j)
            key[j] = w[j];
    }



    free(w);
}


void wrt(int key[], int sz)
{
    int  i;
    for (i = 0; i <sz; ++i)
        printf("%4d%s",key[i],((i < sz - 1) ? "" : "\n"));
}
int main(void)
{
    int sz,key[]={ 4, 3, 6, 67,5,8,7,9};
    sz=sizeof(key) / sizeof(int);
    printf("Before mergesort:\n");
    wrt(key,sz);
    mergesort(key,sz);
    printf("After mergesort:\n");
    wrt(key,sz);
    return 0;
}
搜索更多相关主题的帖子: color 
2013-03-03 00:40
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:3 
调试看看


[fly]存在即是合理[/fly]
2013-03-03 00:45
z627724978
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2013-2-28
收藏
得分:0 
调试结果不对啊
2013-03-03 00:48
z627724978
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2013-2-28
收藏
得分:0 
应该是从小到大排列的
2013-03-03 00:48
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
程序代码:
if (n < m)
{
    printf("ERROR:Array size not apower of 2 - bye!\n");
    exit(1);
}
w = calloc(n, sizeof(int));
assert(w != NULL);
//for (k = 1; k < n; k *=2)
for (k = n/2; k >= 1; k /=2)    //这样改就好了
{
    for(j = 0; j < n - k; j += 2*k)
        merge(key + j, key + j + k, w + j, k, k);

    for (j = 0; j < n; ++j)
        key[j] = w[j];
}


[fly]存在即是合理[/fly]
2013-03-03 01:05
z627724978
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2013-2-28
收藏
得分:0 
但是把数字增加到16 个就又不行了。不知道哪的问题
2013-03-03 01:32
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
算法思路是什么??


[fly]存在即是合理[/fly]
2013-03-03 01:54
梦幻乐园
Rank: 2
等 级:论坛游民
帖 子:62
专家分:87
注 册:2012-10-25
收藏
得分:3 
希望以后你能将程序的作用说明一下,这样便于理解程序,最好加入注释。
 w = calloc(n, sizeof(int));这里应该这样写:w=(int *)calloc(n,sizeof(int));
 printf("%4d%s",key[i],((i < sz - 1) ? "" : "\n"));应该把%s换为%c,? "" :这里的两个 "" 中间应该有空格,反正在我的编译器上,如果没有空格的话会有警告的。
你的编程思路有点看不懂,对数组的排序不用这么复杂吧,有简单地算法的。比如冒泡排序,直接排序等,很多的。
2013-03-03 09:32
shmilyflf
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:356
专家分:1008
注 册:2012-12-9
收藏
得分:3 
话说,楼主的程序是递归程序吗?我左看右看没看出在哪递归的啊……
递归定义:程序调用自身的编程技巧称为递归( recursion),一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法。(引自百度)
还是我孤陋寡闻,这是排序的一种方法就是叫递归排序?……
2013-03-03 21:29
z627724978
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2013-2-28
收藏
得分:0 
回复 9楼 shmilyflf
我在书上整下来的,运行后结果错误,不知道原因在哪里
2013-03-04 13:48
快速回复:这个递归排序的程序编译正确,结果怎么不对,求高手帮忙看下。
数据加载中...
 
   



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

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