| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 705 人关注过本帖
标题:合并排序问题????
只看楼主 加入收藏
ou1111
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:87
专家分:162
注 册:2010-10-26
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
合并排序问题????
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时排序出错????
搜索更多相关主题的帖子: void 
2011-05-01 21:41
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:7 
有完整的代码吗?
2011-05-02 14:46
ou1111
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:87
专家分:162
注 册:2010-10-26
收藏
得分:0 
#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;
}
2011-05-02 18:03
诸葛修勤
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:549
专家分:1955
注 册:2010-10-28
收藏
得分:7 
整个程序 只有一个数组a
怎么合并?

能说说三个函数分别是怎么做的吗(实现什么功能)?
2011-05-02 18:48
ou1111
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:87
专家分:162
注 册:2010-10-26
收藏
得分:0 
这是一个合并排序算法,功能是将数组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;   
    }
}
2011-05-02 18:56
诸葛修勤
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:549
专家分:1955
注 册:2010-10-28
收藏
得分:0 
假设L1 L2 分别为1组数据 元素个数任意  将其合并 得到L3

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


2011-05-02 23:33
ou1111
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:87
专家分:162
注 册:2010-10-26
收藏
得分:0 
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];
}
2011-05-03 17:13
lly10120303
Rank: 2
等 级:论坛游民
帖 子:11
专家分:12
注 册:2011-3-30
收藏
得分:0 
#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;
}
2011-05-05 21:16
快速回复:合并排序问题????
数据加载中...
 
   



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

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