注册 登录
编程论坛 数据结构与算法

合并排序问题????

ou1111 发布于 2011-05-01 21:41, 705 次点击
void merge(float c[],float d[],int l,int m,int r)
{
  int i=l,j=m+1,k=l;
  while((i<=m)&&(j<=r))
      if(c[i]<=c[j]) d[k++]=c[i++];
      else  d[k++]=c[j++];
      if(i>m) for(int q=j;q<=r;q++)  d[k++]=c[q];
      else for(int q=i;q<=m;q++)  d[k++]=c[q];
}
void mergepass(float x[],float y[],int s)   //合并大小相邻的子数组
{int i=0;
   while(i<=M-2*s)   
  {
    merge(x,y,i,i+s-1,i+2*s-1);
    i=i+2*s;
   };
  if(i+s<M) merge(x,y,i,i+s-1,M-1);
  else for(j=i;j<M-1;j++)  x[j]=y[j];
}

void mergesort(float *a)        
{   float *b=new float[M];
    int s=1;
    while(s<M)
    {
      mergepass(a,b,s);//合并到a
      s+=s;
      mergepass(b,a,s);//合并到b
      s+=s;   
    }
}
为什么总是M=4n-1时排序出错????
7 回复
#2
寒风中的细雨2011-05-02 14:46
有完整的代码吗?
#3
ou11112011-05-02 18:03
#include<iostream>
using namespace std;
#define M 7
int i,j;
void merge(double c[],double d[],int l,int m,int r)
{
  int i=l,j=m+1,k=l;
  while((i<=m)&&(j<=r))
      if(c[i]<=c[j]) d[k++]=c[i++];
      else  d[k++]=c[j++];
      if(i>m) for(int q=j;q<=r;q++)  d[k++]=c[q];
      else for(int q=i;q<=m;q++)  d[k++]=c[q];
}
void mergepass(double x[],double y[],int s)   //合并大小相邻的子数组
{int i=0;
   while(i<=M-2*s)   
  {
    merge(x,y,i,i+s-1,i+2*s-1);
    i=i+2*s;
   };
  if(i+s<M) merge(x,y,i,i+s-1,M-1);
  else for(j=i;j<M-1;j++)  x[j]=y[j];
}

void mergesort(double *a)        
{   double *b=new double[M];
    int s=1;
    while(s<M)
    {
      mergepass(a,b,s);//合并到a
      s+=s;
      mergepass(b,a,s);//合并到b
      s+=s;   
    }
}


void main()
{
  double a[M]={8.8,9.3,7.9,8.7,8.9,9.7,9.2};
  mergesort(a);
  for(i=0;i<M;i++)
  cout<<a[i]<<" ";
  cout<<endl;
}
#4
诸葛修勤2011-05-02 18:48
整个程序 只有一个数组a
怎么合并?

能说说三个函数分别是怎么做的吗(实现什么功能)?
#5
ou11112011-05-02 18:56
这是一个合并排序算法,功能是将数组a里的数据从小到大的排序。
合并是在函数里面进行,新建一个数组,暂时存放数据,最后还是拷贝回a,下面就是合并函数。。。。。。
void mergesort(float *a)        
{   float *b=new float[M];
    int s=1;
    while(s<M)
    {
      mergepass(a,b,s);//合并到a
      s+=s;
      mergepass(b,a,s);//合并到b
      s+=s;   
    }
}
#6
诸葛修勤2011-05-02 23:33
假设L1 L2 分别为1组数据 元素个数任意  将其合并 得到L3

L3 满足一定的顺序(升序或者降序)


#7
ou11112011-05-03 17:13
void mergesort(double *a)        
{   double *b=new double[M];    //新建一个数组,存放排好序的元素
    int s=1;                    //在原数组分成子数组,子数组初始长度为1
    while(s<M)
    {
      mergepass(a,b,s);//合并到b      //执行下面函数,将两数组元素合并
      s+=s;                          //子数组长度为两子数组合并后的长度
      mergepass(b,a,s);//合并到a
      s+=s;   
    }
}

void mergepass(double x[],double y[],int s)   //合并大小相邻的子数组
{int i=0;
   while(i<=M-2*s)                           
  {
    merge(x,y,i,i+s-1,i+2*s-1);            //将分成的前两组带入下面函数比较大小
    i=i+2*s;                               //前两组比较结束,往后移,重复操作
   };
//剩下的元素小于2S
  if(i+s<M) merge(x,y,i,i+s-1,M-1);      //能分成两组,单后一组个数少于S,依旧执行比较两数组      
  else for(j=i;j<M-1;j++)  x[j]=y[j];    //剩下元素少于S,只能分一组,直接拷贝到y(即b数组)
}

void merge(double c[],double d[],int l,int m,int r)   {

   int i=l,j=m+1,k=l;                          //i,j分别为相邻两子数组的起始元素位置
    while((i<=m)&&(j<=r))        
      if(c[i]<=c[j]) d[k++]=c[i++];          //比较两子数组元素大小,存到C(即带入的b数组内)
      else  d[k++]=c[j++];                     
      if(i>m) for(int q=j;q<=r;q++)  d[k++]=c[q];   //有一个子数组的元素已比较完,则把另一数组剩下的元素直接拷贝到C
      else for(int q=i;q<=m;q++)  d[k++]=c[q];
}
#8
lly101203032011-05-05 21:16
#include<iostream>
using namespace std;
#define M 7
int i,j;
void merge(double c[],double d[],int l,int m,int r)//将c数组分成两组标胶
{
  int i=l,j=m+1,k=l;
  while((i<=m)&&(j<=r))
      if(c[i]<=c[j]) d[k++]=c[i++];
      else  d[k++]=c[j++];
      if(i>m) for(int q=j;q<=r;q++)  d[k++]=c[q];
      else for(int q=i;q<=m;q++)  d[k++]=c[q];
}
void mergepass(double x[],double y[],int s)   //合并大小相邻的子数组
{int i=0;
   while(i<=M-2*s)   
  {
    merge(x,y,i,i+s-1,i+2*s-1);
    i=i+2*s;
   };
  if(i+s<M) merge(x,y,i,i+s-1,M-1);
  else for(j=i;j<M;j++)  y[j]=x[j];//这里你给写反了,而且是小于M
}

void mergesort(double *a)        
{   double *b=new double[M]; //申请一个数组
    int s=1;
    while(s<M)
    {
      mergepass(a,b,s);//合并到b
      s+=s;
      mergepass(b,a,s);//合并到a
      s+=s;   
    }
}


void main()
{
  double a[M]={8.8,9.3,7.9,8.7,8.9,9.7,9.2};
  mergesort(a);
  for(i=0;i<M;i++)
  cout<<a[i]<<" ";
  cout<<endl;
}
1