算法和数据结构排序归并排序

归并算法

将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n]。

 void Merge(RedType SR[],RedType TR[],int i,int m,int n)
 { /* 将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n]  */
   int j,k,l;
   for(j=m+1,k=i;i<=m&&j<=n;++k) /* 将SR中记录由小到大地并入TR */
     if LQ(SR[i].key,SR[j].key)
       TR[k]=SR[i++];
     else
       TR[k]=SR[j++];
   if(i<=m)
     for(l=0;l<=m-i;l++)
       TR[k+l]=SR[i+l]; /* 将剩余的SR[i..m]复制到TR */
   if(j<=n)
     for(l=0;l<=n-j;l++)
       TR[k+l]=SR[j+l]; /* 将剩余的SR[j..n]复制到TR */
 }

 将SR[s..t]归并排序为TR1[s..t]。

void MSort(RedType SR[],RedType TR1[],int s, int t)
 { /* 将SR[s..t]归并排序为TR1[s..t]。*/
   int m;
   RedType TR2[MAXSIZE+1];
   if(s==t)
     TR1[s]=SR[s];
   else
   {
     m=(s+t)/2; /* 将SR[s..t]平分为SR[s..m]和SR[m+1..t] */
     MSort(SR,TR2,s,m); /* 递归地将SR[s..m]归并为有序的TR2[s..m] */
     MSort(SR,TR2,m+1,t); /* 递归地将SR[m+1..t]归并为有序的TR2[m+1..t] */
     Merge(TR2,TR1,s,m,t); /* 将TR2[s..m]和TR2[m+1..t]归并到TR1[s..t] */
   }
 }

 对顺序表L作归并排序。

 void MergeSort(SqList *L)
 { /* 对顺序表L作归并排序。 */
   MSort((*L).r,(*L).r,1,(*L).length);
 }

 C++可执行代码:

#include<iostream>
using namespace std;
void merge(int a[],int b[],int low,int m,int high)
{
	int i=low,j=m+1;
	int k=low;
	for(;i<=m&&j<=high;)
	{
		if(a[i]<=a[j])
		{
			b[k]=a[i];
			k++;i++;
		}
		else
		{
			b[k]=a[j];
			k++;
			j++;
		}
	}
	if(i<=m)
	{
		for(int l=0;l<=m-i;l++)
			b[k++]=a[i+l];
	}
	if(j<=high)
	{
		for(int l=0;l<=high-j;l++)
			b[k++]=a[j+l];
	}
     // 此处错误, 需要将B拷入A
} void mergesort(int a[],int b[],int low,int high) { if(low==high) b[low]=a[low]; else { int m=(low+high)/2; mergesort(a,b,low,m); mergesort(a,b,m+1,high); merge(a,b,low,m,high); } } int main() { int a[20];int b[20]; int n; while(cin>>n) { for(int i=0;i<n;i++) cin>>a[i]; mergesort(a,b,0,n-1); for(int i=0;i<n;i++) cout<<b[i]<<' '; cout<<endl; } return 0; }
原文地址:https://www.cnblogs.com/tgkx1054/p/2599134.html