注册 登录
编程论坛 C++教室

麻烦大家帮忙看看这个合并排序程序哪里错了

sourse 发布于 2011-09-18 03:48, 430 次点击
程序可以运行,但是结果不正确,弄了很久都不知道哪里错了,求助下大家。。谢谢

程序代码:
#include <stdio.h>

int a[]={78,15,24,16,89,135,4,66};
int b[8];

void merge1(int low,int mid,int high)
{
    int i=low,j=mid+1;
    int    k=0;
    while (i < mid && j < high)
        if (a[i]<a[j])
            b[k++]=a[i++];
        else
            b[k++]=a[j++];

    while (i<mid)
        b[k++]=a[i++];
    while (j<high)
        b[k++]=a[j++];
}

void sort1(int low,int high)
{
    if(low<high)
    {
        int mid=(low+high)/2;
        printf("sort (%d-%d, %d-%d) %d %d %d %d %d %d %d %d\n",
               low, mid, mid+1, high,
               b[0],b[1], b[2], b[3], b[4], b[5], b[6], b[7]);
        sort1(low,mid);
        sort1(mid+1,high);
        merge1(low,mid,high);
        printf("merge (%d-%d, %d-%d) to %d %d %d %d %d %d %d %d\n",
               low, mid, mid+1, high,
               b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7]);
    }

}

void main()
{
    sort1(0,7);
}
4 回复
#2
玩出来的代码2011-09-18 10:40
程序代码:

void merge1(int low,int mid,int high)
{
    int i=low,j=mid+1;
    int    k=low;
    while (i <=mid && j <= high)
        if (a[i]<a[j])
            b[k++]=a[i++];
        else
            b[k++]=a[j++];

    while (i<=mid)
        b[k++]=a[i++];
    while (j<=high)
        b[k++]=a[j++];
    for(int index=low;index<=high;index++)
    {
        a[index]=b[index];
    }
}


你分段排序后排序的结果都没有赋值给a数组,哪来的排序。
#3
编程的乐趣2011-09-18 10:43
hehe
#4
sourse2011-09-18 13:36
回复 2楼 玩出来的代码
呃,终于弄明白了,给绕进去了。。谢谢哈。。
#5
lqsh2011-09-18 22:44
程序代码:
#include <iostream>
using namespace std;
const int MAX=10;
void marge(int n1[],int m1[],int i,int m,int n)
{
    int k,j,l;
    for(j=m+1,k=i;j<=n&&i<=m;++k)
    {
        if(n1[k]<=n1[j])
        {
            m1[k]=n1[i++];
        }
        else
        {
            m1[k]=n1[j++];
        }
    }
    while(i<=m)
    {
      m1[k++]=n1[i++];
    }
    while(j<=n)
    {
        m1[k++]=n1[j++];
    }
}
void marge_sort(int n[],int n1[],int s,int r)
{
    //将n[s-r]排好序归并为n1[s-r]
    int n2[MAX];
    if(s==r)
    {
        n1[s]=n[s];//递归结束条件
    }
    else
    {
        int mid=(s+r)/2;//将n[s-r]均分成n[s-mid]和n[mid+1-r]
        marge_sort(n,n2,s,mid);//递归的将n[s-mid]归并为有序的n2[s-mid]
        marge_sort(n,n2,mid+1,r);//递归的将n[mid+1-r]归并为有序的n2[mid+1-r]
        marge(n2,n1,s,mid,r);//将n2[s-mid]和n2[mid+1-r]合并为n1[s-r]
    }
}
int main()
{
    int m[]={0,2,1,4,3,5};
    marge_sort(m,m,0,5);
    for(int i=0;i<=5;i++)
    {
        cout<<m[i]<<" ";
    }
    cout<<endl;
    return 0;
}
顺便也写了一个希望能给你一点帮助
1