//此处只贴了代码,具体的执行过程在我的百度空间中给出了,就不搬过来了!
//链接是:http://hi.baidu.com/wolinxuebin/blog/item/996f6dc851ca7ee252664f8e.html
// InsertionSort.cpp : 定义控制台应用程序的入口点。
//
//#include "stdafx.h"
#include<iostream>
using namespace std;
#define MAXNUM 2147483647 //定义无穷大
void merge(int *a,int p,int q,int r);//合并算法
void mergeSort(int *a,int p,int r); //合并排序
int main()
{
int size, *a;
while(1)
{
cout<<"输入字符串长度:"<<endl;
cin>>size; //输入字符串长度
if(size > 0) {
cout<<"请输入"<<size<<"个待排序数字:"<<endl;
a = new int [size]; //开辟动态数组空间
for(int i=0; i<size; i++)
{
cin>>a[i];
}
mergeSort(a,1,size); //调用分治排序程序
}
else
cout<<"输入长度错误!"<<endl;
for(int i=0; i<size; i++) //打印数组
{
cout<<a[i]<<" ";
}
cout<<endl;
}
return 0;
}
void merge(int *a,int p,int q,int r) //合并算法
{
int i,j;
int n1,n2;
n1 = q - p + 1;
n2 = r - q;
int *L = new int[n1+1]; //开辟左右两个数组
int *R = new int[n2+1];
for( i=0; i<n1; i++) { L[i] = a[p+i-1];} //将a中的值赋值给左右数组(L、R)
for( j=0; j<n2; j++) { R[j] = a[q+j];}
L[n1] = MAXNUM; //将数组最后一位用无穷大代替
R[n2] = MAXNUM;
i = j =0;
for(int k=p-1; k<r; k++)
{
if(L[i]<=R[j]) { //比较赋值
a[k] = L[i];
i++;
}
else {
a[k] = R[j];
j++;
}
}
delete []L; //删除数组释放内存
delete []R;
}
void mergeSort(int *a,int p,int r) //合并排序
{
int q;
if(p<r){
q = (p + r)/2;
mergeSort(a,p,q);
mergeSort(a,q+1,r);
merge(a,p,q,r);
}
}