| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 448 人关注过本帖
标题:初学归并排序,但输出无结果...
只看楼主 加入收藏
Buger
Rank: 1
等 级:新手上路
帖 子:60
专家分:7
注 册:2013-3-20
结帖率:84.62%
收藏
已结贴  问题点数:10 回复次数:8 
初学归并排序,但输出无结果...
程序代码:
#include <stdio.h>
#include <malloc.h>
void Merge(int c[], int d[], int l, int m, int r) {
    int i = 1, j = m + 1, k = l, q;
    while((i <= m) && (j <= r))
        if(c[i] <= c[j]) d[k++] = c[i++];
        else d[k++] = c[j++];
    if(i > m)
        for(q = j; q <= r; q++) d[k++] = c[q];
    else
        for(q = i; q <= m; q++) d[k++] = c[q];
}
void Mergepass(int x[], int y[], int s, int n) {
    int i = 0, j;
    while(i <= n - 2 * s) {
        Merge(x, y, i, i + s - 1, i + 2 * s - 1);
        i = i + 2 * s;
    }
    if(i + s < n) Merge(x, y, i, i + s - 1, n - 1) ;
    else for(j = i; j <= n - 1; j++) y[j] = x[j];
}
void MergeSort(int a[], int n) {
    int *temp=(int*)malloc(20), s = 1;
    while(s < n) {
        Mergepass(a, temp, s, n);
        s += s;
        Mergepass(temp, a, s, n);
        s += s;
    }
}
int main() {
    int a[] = {3, 5, 3, 6, 4, 7, 5, 7, 4}, i;
    MergeSort(a, 9);
    for(i = 0; i < 9; i++) printf("%d ", a[i]);
    printf("\n");
    return 0;
}
哪位大侠帮忙看看...
2013-03-22 21:07
Buger
Rank: 1
等 级:新手上路
帖 子:60
专家分:7
注 册:2013-3-20
收藏
得分:0 
自己顶自己....
2013-03-22 21:22
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:10 
我也不知道对不对,MergeSort函数中,你定义了指针temp,而且把它作为了Mergepass函数的参数,可是Mergepass函数中与指针temp对应的形参却是数组,类型不匹配啊~

三十年河东,三十年河西,莫欺少年穷!
2013-03-22 21:51
Buger
Rank: 1
等 级:新手上路
帖 子:60
专家分:7
注 册:2013-3-20
收藏
得分:0 
你调试好了再发表也好啊,免得我又把代码搞乱....,貌似不行
2013-03-22 22:03
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:0 
回复 4楼 Buger
表示不好意思啊,只是提一下自己的想法,程序乱了帖子上不还有嘛,呵呵

三十年河东,三十年河西,莫欺少年穷!
2013-03-22 22:23
Buger
Rank: 1
等 级:新手上路
帖 子:60
专家分:7
注 册:2013-3-20
收藏
得分:0 
呵呵...
2013-03-22 22:35
Buger
Rank: 1
等 级:新手上路
帖 子:60
专家分:7
注 册:2013-3-20
收藏
得分:0 
自己搞定了,多谢
2013-03-22 22:49
lsnaimei
Rank: 2
等 级:论坛游民
帖 子:25
专家分:47
注 册:2012-3-30
收藏
得分:0 
#include <iostream>
#include <ctime>
#include <cstring>
using namespace std;
/** 将a开头的长为length的数组和b开头长为right的数组 合并 n为数组长度,用于最后一组 */
void Merge(int* data, int a, int b, int length, int n){
int right;
if(b+length-1 >= n-1) right = n-b;
else right = length;
int* temp = new int[length+right];
int i = 0, j = 0;
while(i<=length-1&&j<=right-1){
if(data[a+i] <= data[b+j]){
temp[i+j] = data[a+i]; i++; }
else{ temp[i+j] = data[b+j]; j++; }
}
if(j == right){// a中还有元素,且全都比b中的大,a[i]还未使用
memcpy(data+a+i+j, data+a+i,(length-i)*sizeof(int));
}
memcpy(data+a, temp, (i+j)*sizeof(int) );
delete temp;
}
void MergeSort(int* data, int n){
int step = 1;
while(step < n){
for(int i = 0; i <= n-step-1; i += 2*step)
Merge(data, i, i+step, step, n);
// 将i和i+step这两个有序序列进行合并
// 序列长度为step
// 当i以后的长度小于或者等于step时,退出
step *= 2;
}
}
int main(){
int n;
cin >> n;
int *data = new int[n];
if(!data) exit(1);
int k = n;
while(k --){
cin >> data[n-k-1];
}
clock_t s = clock();
MergeSort(data, n);
clock_t e = clock();
k = n;
while(k --){
cout << data[n-k-1] << ' ';
}
cout << endl;
cout << "the algrothem used " << e-s << " miliseconds."
<< endl;
delete data;
return 0; }
2013-03-22 22:58
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:0 
回复 8楼 lsnaimei
还是百度好啊  呵呵

三十年河东,三十年河西,莫欺少年穷!
2013-03-23 00:42
快速回复:初学归并排序,但输出无结果...
数据加载中...
 
   



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

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