基本思想:
将待排序元素分成大小大致相同的2个子集合,分别对2个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的合。
例如:
算法mergeSort的递归过程可以消去。
//合并排序(递归)
#include <iostream>
using namespace std;
template <typename Type>
void Copy(Type a[],Type b[], int left, int right)
{
//复制回数组a
for(int i = left; i <= right; i++ )
{
a[i] = b[i];
}
}
template <typename Type>
void Merge(Type a[], Type d[],int l,int m, int r)
{
//合并c[l:m]和c[m+1:r]到d[l:r]
int i = l, j = m+1, k =l;
while((i <= m) && (j <= r))
{
if(a[i] <= a[j])
{
d[k++] = a[i++];
} else {
d[k++] = a[j++];
}
}
if(i > m)
{
for(int q = j; q <= r; q++)
d[k++] = a[q];
} else {
for(int q = i; q <= m; q++)
d[k++] = a[q];
}
}
template <typename Type>
void MergeSort(Type a[], int left, int right)
{
int *b = new int[left+right+1];
if(left < right)
{
//至少有2个元素
int i = 0;
//取中点
i = (left + right)/2;
MergeSort(a,left,i);
MergeSort(a,i+1,right);
//合并到数组b
Merge(a,b,left,i,right);
//复制回数组a
Copy(a,b,left,right);
}
}
int main()
{
//int a[8] = {5,6,7,8,1,2,3,4};
int n; //输入数字个数
cout<<"输入要排序数字的个数:"<<endl;
cin>>n;
int *a = new int[n];
cout<<"输入要排序数:"<<endl;
for(int i = 0; i < n; i++)
{
cin>>a[i];
}
MergeSort(a,0,n-1);
cout<<"输出排序后的数列:"<<endl;
for(int i = 0; i < n; i++)
cout<<a[i]<<" ";
delete[] a;
return 0;
}