正文

合并排序(分治法)2006-11-22 16:59:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/jixian/20628.html

分享到:

//1.当元素个数为1时,终止排序
//2.否则将待排序元素分成大小规模相同的两个子集合,分别对两个子集合排序(
//3.最终将排序好的子集合合并为所要求的排序好的集合


#include<iostream>
#include<cstdlib>
using namespace std;

void hb(int s[],int tem[],int left,int middle,int right)  //合并算法
{
 int i=left;
 int j=middle+1;

 int k=left-1;                  //临时数组开头处
 while(i<=middle && j<=right)
 {
  if(s[i] <= s[j])
   tem[++k] = s[i++];
  else
   tem[++k] = s[j++];
 }

 if(i > middle)
 {
  int q;
  for(q=j;q<=right;q++)
   tem[++k] = s[q];
 }
 else
 {
  int q;
  for(q=i;q<=middle;q++)
   tem[++k] = s[q];
 }
 for(int q=left;q<=right;q++)        //把排序好的数重新放回S中
  s[q] = tem[q];
 
}

 


void mergesort(int s[],int left,int right)   //排序算法

 if(left == right || left+1 == right)
 {
  if(s[left] > s[right])
  {
   int temp = s[left];
   s[left] = s[right];
   s[right] = temp;
  }
 }
 
 else
 {
  int middle = (left + right) / 2;
  mergesort(s,left,middle);
  mergesort(s,middle+1,right);
  int tem[20]; //临时数组
  
  hb(s,tem,left,middle,right);
 }
}


int main()
{
 int s[] = {1,6,9,4,3,8,11};
 int left = 0;
 int right = sizeof s / sizeof *s - 1;
 cout<<"排序前: "<<endl;
 for(int i=0;i<=right;i++)
  cout<<s[i]<<"  ";
 cout<<endl;

 mergesort(s,left,right);

 cout<<"排序后: "<<endl;
 for(i=0;i<=right;i++)
  cout<<s[i]<<"  ";
 cout<<endl;
}
 

 


 

阅读(4686) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册