c语言-哪位大神知道我这个归并排序的代码究竟哪里出了问题?

问题描述

哪位大神知道我这个归并排序的代码究竟哪里出了问题?

代码如下:
找了好久,实在找不出哪里的问题:

 #include<stdio.h>
void merge(int s[],int a[],int start,int mid,int end)
{
    int i=start;
    int j=mid+1;
    int k=start;
    while(i<=mid && j<=end) {
        if(a[i]<a[j]) {
            s[k++]=a[i++];
        } else {
            s[k++]=a[j++];
        }
    }
    if(i<=mid) {
        s[k++]=a[i++];
    }
    if(j<=end) {
        s[k++]=a[j++];
    }
}

void merge_sort(int s[],int a[],int start,int end)
{
    int t[20];
    int mid;
    if(start==end) {
        s[start]=a[start];
    } else {
        mid=(start+end)/2;
        merge_sort(t,a,start,mid);
        merge_sort(t,a,mid+1,end);
        merge(s,t,start,mid,end);
    }
}

int main()
{
    int i;
    int n=5;
    int a[n],s[n];
    printf("Enter %d nimbers: n",n);
    for(i=0;i<n;i++) {
        scanf("%d",&a[i]);
    }
    printf("n");
    merge_sort(s,a,0,n-1);
    printf("The sorted order is: n");
    for(i=0;i<n;i++) {
        printf("%5d",s[i]);
    }
    printf("n");
    return 0;
}

解决方案

我看到你这个问题,刚开始还以为是二分法,摸了半天瞎。后来发现时归并排序,然后我发现我也不会,就调你的程序,查资料什么事归并排序。
然后发现其实问题很简单,
while(i<=mid) {
s[k++]=a[i++];
}
while(j<=end) {
s[k++]=a[j++];
}
这个地方粗一看觉得是对的,但是后来我细想,要是1个排序的数组:4 5 3。然后经过你的这段程序,
while(i<=mid && j<=end) {
if(a[i]<a[j]) {
s[k++]=a[i++];
} else {
s[k++]=a[j++];
}
}

Enter 5 nimbers:
5 4 3 2 1

0-4
0-2
0-1
0-0
1-1
0 0 1
4 5 0 0 0
2-2
0 1 2
3 4 0 0 0
3-4
3-3
4-4
3 3 4
3 4 0 1 2
0 2 4
1 2 3 0 0
The sorted order is:
1 2 3 0 0
第一次,把三排到最开始,i ++ 了,while就退出了,这是还有4 5没有合并,然后你下面的是if(),这就造成,最多只能加一个元素的情况,把5给
丢了。现在是3 4,然后合并了 1 2,成了 3 4 0 1 2,在排序的时候,把 1 2 先拍, 这时候while退出,然后 就合并了一个 3 , 4 给丢了。换成 while
就行了。还有,定义数组要规范,然后还要初始化,这是规范化操作。我贴上了测试的数据。不知道你看不看得懂。

解决方案二:

 int main()
{
    int i;
    const int n=5;//修改
    int a[n],s[2*n];//修改

解决方案三:

你的程序的思路没啥问题,只是细节上。还有主函数中数组的定义也有问题,c/c++中不能像你那样的定义一个数组。如果你不知道要定义的数组多大,就
要动态的去建立数组,要么就一开始指定数组元素的个数。比如a【5】,不要像你程序那样子定义一个数组。
下面是一段自己写的归并排序的代码你参考下:
1 #include

2 #include
3 void merge(int A[],int begin,int mid,int end);//合并函数
4 void mergesort(int A[],int begin,int end);//归并排序函数
5 void PRINT(int A[],int n);//数组大于函数
6
7 int main()
8 {
9 int a[5] = {9,3,2,0,1};
10

11 PRINT(a,5);
12 mergesort(a,0,5);
13 PRINT(a,5);
14

15 return 0;
16 }
17
18 void PRINT(int A[],int n)//数组大于函数
19 {
20 int i;
21 for(i=0;i
22 {
23 printf("%d--",A[i]);
24
25 }
26
27 printf("n");
28 }
29
30 void merge(int A[],int begin,int mid,int end)//合并函数实现
31 {
32 int i = begin;//数组左端有序起始
33 int j= mid+1;//数组右端有序起始
34 int k = begin;//临时数组下标起始
35
36 int *T = (int *)malloc((end - begin+1)*sizeof(int)); //申请临时数组空间
37 while(i
38 {
39 if(A[i]40 T[k++] = A[i++];//把左端元素放入临时数组
41 if(A[i]>A[j])//如果左端元素大于右端元素
42 T[k++] = A[j++];//右端元素放入临时数组
43
44 }

45
46 while(i<=mid)//如果左端还有元素
47 T[k++] = A[i++];//拷贝到临时数组
48 while(j<= end)//如果右端还有元素
49 T[k++] = A[j++];//拷贝到临时数组
50

51 for(i=begin,k=begin;k<end-begin+1;i++,k++)
52 {
53 A[i]=T[k];//把临时数组元素拷贝回原数组
54 }
55
56 free(T);//释放申请的临时空间
57 }
58
59
60 void mergesort(int A[],int begin,int end)
61 {
62
63 if(begin < end)//只要数组中元素超过一个
64 {
65 int mid = (begin+end)/2;//从中间开始划分
66 mergesort(A,begin,mid);//左端有序
67 mergesort(A,mid+1,end);//右端有序
68
69 merge(A,begin,mid,end);//归并
70 }
71 }

解决方案四:

void merge(int s[],int a[],int start,int mid,int end)
{
int i=start;
int j=mid+1;
int k=start;
while(i<=mid && j<=end) {
if(a[i]<a[j]) {
s[k++]=a[i++];
} else {
s[k++]=a[j++];
}
}
** while**(i<=mid) {
s[k++]=a[i++];
}
while(j<=end) {
s[k++]=a[j++];
}
}

这两个地方是while循环。

时间: 2024-09-27 02:33:08

c语言-哪位大神知道我这个归并排序的代码究竟哪里出了问题?的相关文章

哪位大神帮我注释这段代码,最好详细一点(AT89s**与霍尔元件测速报警应用)。有附电路的原理图

问题描述 哪位大神帮我注释这段代码,最好详细一点(AT89s**与霍尔元件测速报警应用).有附电路的原理图 5C #includeunsigned char code table[12]={0xc00xf90xa40xb00x990x920x820xf80x800x900xff0xBF};unsigned char code table2[12]={0x400x790x240x300x190x120x020x780x000x100xff}; sbit CS3020=P1^0;sbit SET=P

稀疏表示 协作表示-哪位大神有协作表示分类器的代码?

问题描述 哪位大神有协作表示分类器的代码? 最近在写论文,不知道稀疏表示和协作表示有什么区别?哪位大神有这方面的代码啊?急求啊!! 解决方案 Google Scholar里面搜索 sparse representation or collaborative representation,有很多paper可以参考 解决方案二: 应该是有的.你可以找下.

语言求助-输大神看一下我写的宿舍管理系统到底出啥问题了!急,马上要交了!!!

问题描述 输大神看一下我写的宿舍管理系统到底出啥问题了!急,马上要交了!!! 原本只要一个结构体的,但我弄复杂了,求大神帮下忙!这个程序主要是输入时总会得不到正确的链表,我试了好久也没成功,都快崩溃了!简单地用DOS系统运行和其他编程软件运行结果都不同! 学生宿舍管理系统设计 功能:实现简单的学生宿舍基本信息管理,宿舍的基本信息包括楼号.房间号.面积.所容纳人数.已入住人数等,系统以文本菜单形式工作. 基本要求: 实现宿舍基本信息的录入.修改.删除. 实现宿舍信息的浏览.查询 实现安排学生入住.

用c语言读写bmp图像,图像的高和宽输出不正确,请问代码哪里有问题?哪位大神可以解答一下,谢谢

问题描述 用c语言读写bmp图像,图像的高和宽输出不正确,请问代码哪里有问题?哪位大神可以解答一下,谢谢 #include #include #include int ReadBmp(const char bmpName); /函数原型*/BITMAPFILEHEADER fileHead; /*文件信息头*/ BITMAPINFOHEADER infoHead; /*位图信息头*/RGBQUAD pColorTable[256]; /*颜色表指针*/unsigned char pBmpBuf;

代码-求解答谢谢,有关C语言的问题,请哪位大神解答。谢谢

问题描述 求解答谢谢,有关C语言的问题,请哪位大神解答.谢谢 假设有4个有序表A,B,C和D,它们分别含有的元素个数为17,28,36,67,各个表的元素已按照升序排列,如何用Huffman树,通过两两合并并合成有序表,要求在最坏的情况下比较次数达到最小,说明你的合并过程!!! 请问这个怎么合并啊,方便的话给个代码可以吗,谢谢 解决方案 求大神帮解答javaEE这个问题,谢谢了liunx 串口通信问题,跪求各位大神解答 解决方案二: 霍夫曼树构造思想就是依次选择当前最短的两个表进行合并,每次合并

哪位大神分析一下这是什么语言?

问题描述 哪位大神分析一下这是什么语言? @CreateVar( numTrainTrials 300 numTrainTrials 150 dwellTime 144 # ms OffRate 168.69374021197876 # ms OnRate 10.527192211200115 # ms ActivityHz 2.8347775148279837 mePct 0.20021843519101787 # Percent of Activity due to me PyrToInte

手机-哪位大神有c语言源码的音乐播放器啊?

问题描述 哪位大神有c语言源码的音乐播放器啊? 哪位大神有c语言源码的音乐播放器啊?能发给我一下吗?万分感谢!!!!!!!! 解决方案 http://download.csdn.net/detail/u010252178/7538911http://download.csdn.net/detail/u010105970/6762045http://download.csdn.net/download/lzh9955/2125984

【求助】请问哪位大神了解R语言ape聚类构建进化树方法吗?

问题描述 [求助]请问哪位大神了解R语言ape聚类构建进化树方法吗? [求助]请问哪位大神了解R语言ape聚类构建进化树方法吗?我想知道如何设置其bootstrap参数为1000?

sql server-关于SQL的有哪位大神知道吗?

问题描述 关于SQL的有哪位大神知道吗? SQLserver2008怎么显示行数?有哪位大神知道吗?关于SQL的有哪位大神知道吗? 解决方案 最左边不是有行数吗? 解决方案二: sql 常用语法 你知道吗? 解决方案三: 工具--选项--文本编辑器--所有语言--显示--行号 解决方案四: 你是要在查询结果中显示行数..还是要在查询语句的SQLwindow编辑器中显示行数? 解决方案五: 如果是想要统计记录条数,通过符合基本SQL规范的: select count(*) from 表名: 就可以