| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 591 人关注过本帖
标题:二路归并排序算法的实现(下面代码好像不通,请高手指正)
只看楼主 加入收藏
hwshtongxin
Rank: 1
等 级:新手上路
帖 子:35
专家分:4
注 册:2009-1-6
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:1 
二路归并排序算法的实现(下面代码好像不通,请高手指正)
#include<iostream>
using namespace std;
////
int b[7];
void merge(int a[],int m, int n, int l);//将两个与排序数列组合成有序数列
void merge_sort(int a[],int m, int n);//递归的排序数列
////////////////
int main()
{
  int a[7]={1,2,3,4,5,6,7};
  merge_sort(a,0,6);
  cout<<endl;
  for(int i=0; i<7; i++)
      cout<<b[i]<<'\t';
  cout<<endl;
  //////////////////////
   return 0;
}
///
void merge_sort(int a[], int m, int n)
{
 int q;
 if(m<n)
 {
   q=(m+n)/2;
   merge_sort(a,m,q);//当m=n时,此函数调用结束,而没有机会执行下面的的函数,
   //但是,目的要求要实现 在上面函数调用结束后再继续执行下面的函数,那么如何来改进?
   merge_sort(a,q+1,n);
   merge(a,m,q,n);
 }
 //////////////////////
}
//////////////////////
//////////////////////
void merge(int a[],int m, int n, int l)
{
    int i, j, k;
////////////////////
    k=m;
    i=m;
    j=n+1;
    //////////////
    while( i<=n && j<=l )
    {
     if( a[i]<=a[j] )
     {
       b[k]=a[i];
       i++;
     }
     else
     {
         b[k]=a[j];
         j++;
     }
    }
    ///////////////
    while( i<=n)
    {
        b[k]=a[i];
        i++; k++;
    }
    while( j<=l)
    {
        b[k]=a[j];
        k++;
        j++;
    }
}
搜索更多相关主题的帖子: 代码 算法 
2009-11-11 13:48
流星雨
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:JAVA风暴
等 级:版主
威 望:43
帖 子:1854
专家分:1868
注 册:2004-5-30
收藏
得分:20 
#include<stdio.h>
#include<stdlib.h>
typedef int RecType;//要排序元素类型
void Merge(RecType *R,int low,int m,int high)
{//将两个有序的子文件R[low..m)和R[m+1..high]归并成一个有序的子文件R[low..high]
int i=low,j=m+1,p=0; //置初始值
RecType *R1; //R1是局部向量
R1=(RecType *)malloc((high-low+1)*sizeof(RecType));
if(!R1)return; //申请空间失败
while(i<=m&&j<=high) //两子文件非空时取其小者输出到R1[p]上
R1[p++]=(R[i]<=R[j])?R[i++]:R[j++];
while(i<=m) //若第1个子文件非空,则复制剩余记录到R1中
R1[p++]=R[i++];
while(j<=high) //若第2个子文件非空,则复制剩余记录到R1中
R1[p++]=R[j++];
for(p=0,i=low;i<=high;p++,i++)
R[i]=R1[p];//归并完成后将结果复制回R[low..high]
}

void MergeSort(RecType R[],int low,int high)
{//用分治法对R[low..high]进行二路归并排序
int mid;
if(low<high){//区间长度大于1
mid=(low+high)/2;//分解
MergeSort(R,low,mid);//递归地对R[low..mid]排序
MergeSort(R,mid+1,high); //递归地对R[mid+1..high]排序
Merge(R,low,mid,high);//组合,将两个有序区归并为一个有序区
}
}
void main()
{
int a[8]={21,34,56,43,99,37,78,10};//这里对8个元素进行排序
int low=0,high=7;//初始化low和high的值
MergeSort(a,low,high);
for(int i=low;i<=high;i++)printf("%d ",a[i]);//输出测试
printf("\n");
}
//以前大学留下的,注释比较齐全。

感谢你们带我找到星空下美丽神话,无论经历多少苦痛也不放弃的梦;插上希望翅膀乘风我和你们飞翔,飞过海天尽头携手把梦想实现.....
2009-11-12 15:32
快速回复:二路归并排序算法的实现(下面代码好像不通,请高手指正)
数据加载中...
 
   



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

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