归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列。
原理:归并排序具体工作原理如下(假设序列共有n个元素):
将序列每相邻两个数字进行归并操作(merge),形成floor(n/2)个序列,排序后每个序列包含两个元素
将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素
重复步骤2,直到所有元素排序完毕
C++实现代码:
#include <iostream>
using namespace std;
void Merge(int a[],int a1[],int first,int m,int last)
{
int i=first;
int j=m+1;
int k=first;
while(i<=m&&j<=last)
{
if (a[i]<=a[j])
a1[k++]=a[i++];
else
a1[k++]=a[j++];
}
if (i<=m)
{
while (i<=m)
a1[k++]=a[i++];
}
else
{
while(j<=last)
a1[k++]=a[j++];
}
int n;
for (n=first;n<=last;n++)
{
a[n]=a1[n];
}
}
void MergeSort(int a[],int a1[],int first,int last)
{
if (first<last)
{
int m=(first+last)/2;
MergeSort(a,a1,first,m);
MergeSort(a,a1,m+1,last);
Merge(a,a1,first,m,last);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int arr[8]={10,3,5,1,9,34,54,565};
int arr1[8];
MergeSort(arr,arr1,0,7);
int i;
for (i=0;i<8;i++)
{
cout<<arr[i]<<" ";
}
return 0;
}