用c++实现归并排序的问题

用c++实现归并排序的问题

问题描述:

打算用递归法实现归并排序,但结果总是不对,找不到问题,求大佬解答
#include
using namespace std;
int a[100];
void merge(int m[],int l,int r,int rightend);
void sort(int m[],int l,int r);
void msort();
int n;
int main()
{
cin>>n;
for(int i=0;i {
cin>>a[i];
}
msort();
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
}
void sort(int m[],int l, int r)
{
int center;
if(l<r)
{
center=(l+r)/2;
sort(m,l,center);
sort(m,center+1,r);
merge(m,l,center+1,r);
}
}
void merge(int m[],int l,int r,int rightend)
{
int t=0;
int leftend=r-1;
while(l<=leftend&&r<=rightend)
{
if(a[l]<=a[r])
{
m[t++]=a[l++];
}
else
{
m[t++]=a[r++];
}
}
while(l<=leftend) m[t++]=a[l++];
while(r<=rightend) m[t++]=a[r++];
for(int i=0;i<t;i++)
{
a[l+i]=m[i];
}
}
void msort()
{
int temp[100];
sort(temp,0,n-1);
}

找到两处问题
1.t应该从l开始
2.l中间已经修改了
修改后代码如下

 #include<stdio.h>
#include <iostream>
using namespace std;
int a[100]; 
void merge(int m[],int l,int r,int rightend);
void sort(int m[],int l,int r);
void msort();
int n;
int main()
{
  cin>>n;
  for(int i=0;i <n;++i)
  {
    cin>>a[i];
  }
  msort();
  for(int i=0;i<n;i++)
  {
    cout<<a[i]<<" ";
  }
}
void sort(int m[],int l, int r)
{
  int center;
  if(l<r)
  {
    center=(l+r)/2;
    sort(m,l,center);
    sort(m,center+1,r);
    merge(m,l,center+1,r);
  }
}
void merge(int m[],int l,int r,int rightend)
{
  //这里的t应该从该l开始而不是从0 开始
  int t=l;
  //这里要将l保存下来
  int start = l;
  int leftend=r-1;
  while(l<=leftend && r<=rightend)
  {
    if(a[l]<=a[r])
    {
      m[t++]=a[l++];
    }
    else
    {
      m[t++]=a[r++];
    }
  }
  while(l<=leftend) m[t++]=a[l++];
  while(r<=rightend) m[t++]=a[r++];

  //因为上面的l++,已经将l加到了leftend
  //这里应该从开始start 到 最后的 t 都应该修改
  for(int i=start;i<t;i++)
  {
    a[i]=m[i];
  }
}
void msort()
{
  int temp[100];
  sort(temp,0,n-1);
}

感觉程序是有问题,但不知道怎么描述。试试吧每一次迭代的结果打印出来,可能你也会明白的

看你代码,下面部分是想把合并好的数 重新写入数组a吧。

    for(int i=0;i<t;i++)
    {
        a[l+i]=m[i];
    }

问题应该是变量l在前面已经变掉了,这时的l实际上已经是center了

看你代码,下面部分是想把合并好的数 重新写入数组a吧。

m[t++]=a[l++];这里已经把 l 改变了

楼主可以用Visual Studio进行单步调试看看 那一步出了问题