合并排序算法

来源:互联网 发布:穆雅斓淘宝店铺链接 编辑:程序博客网 时间:2024/06/01 22:06

算法hebingpaixu函数的递归过程只是将待排序的集合一分为二,直至待排序集合只剩下1个元素为止。

然后不断的合并2个排好序的数组段。(它可以和快速排序时间复杂度一致)

举个例子,大致是按这样的情况进行的

初始序列[8] [4] [5] [6] [2] [1] [7] [3]

归并到b [4 8] [5 6] [1 2] [3 7]

复制到a [4 8] [5 6] [1 2] [3 7]

归并到b [4 5 6 8] [1 2 3 7]

复制到a [4 5 6 8] [1 2 3 7]

归并到b [1 2 3 4 5 6 7 8]

复制到a [1 2 3 4 5 6 7 8]

#include<iostream> #include<conio.h> #include<cstdlib> using namespace std; void hexinsuanfa(int a[],int b[],int l,int mid,int r) {  int La,Lb,i;  La = Lb = l;//La,Lb分别是a,b数组的左边界  i=mid+1;  while((La<=mid)&&(i<=r))  {  if(a[La]<=a[i]) b[Lb++] = a[La++];  else b[Lb++] = a[i++];  }  if(La>mid)  {  for(int j = i;j<=r;j++) b[Lb++] = a[j];  }  else for(int j = La;j<=mid;j++) b[Lb++] = a[j]; } void hebingpaixu(int a[],int left,int right,int n) {  int i;  int *b = new int[n];   if(left<right)  {  i = (right + left)/2;  hebingpaixu(a,left,i,n);//把左半边切割  hebingpaixu(a,i+1,right,n);//把左右半边切割  hexinsuanfa(a,b,left,i,right);//把切割后排好序的个个a数组归并到b中  for(int j = left;j<=right;j++)  {  a[j] = b[j]; //把b数组归并到a中  }  } } int main() {  int n,i=0,j=0;  cout<<"输入你要排序的数组大小:"; cin>>n;  int *hr = new int[n];  cout<<"输入你要排序的数组内容:"<<endl;  for(i=0;i<n;i++) cin>>hr[i];  hebingpaixu(hr,0,n-1,n);  for(i=0;i<n;i++) cout<<hr[i]<<' ';  cout<<endl;  getch();  return 0; }


 

原创粉丝点击