/*归并排序算法思想,其思想是基于合并,
将两个或两个以上的有序表合成一个新的有序表
首先将n个记录看成n个有序的子序列,每个子序列的长度为1
然后两两归并得到n/2个长度为2的有序子序列,再在此基础上,
对长度为二的进行两两归并,得到若干个长度为4的有序子序列。
如此重复,直到得到一个长度为n的有序序列为止*/
#include<iostream>
#include<cstdlib>
using namespace std;
#define N 100
typedef int KeyType;
typedef char OtherType;
typedef struct RecordType{
KeyType key;
OtherType other_data;
}type;
void Merge(type r1[],int low,int mid,int high,type r2[]){
int i=low;
int j=mid+1;
int k=low;
while((i<=mid)&&(j<=high)){
if(r1[i].key<=r1[j].key){
r2[k]=r1[i];
i++;
}
else{
r2[k]=r1[j];
j++;
}
k++;
}
while(i<=mid){
r2[k]=r1[i];
k++;
i++;
}
while(j<=high){
r2[k]=r1[j];
k++;
j++;
}
//cout<<"merge"<<endl;
}
void MSort(type r1[],int low,int high,type r3[]){
type* r2;
r2=(type* )malloc(sizeof(type)*(high-low+1));
if(low==high){
r3[low]=r1[low];
//cout<<"Msort"<<endl;
}
else{
int mid=(low+high)/2;
MSort(r1,low,mid,r2);
//cout<<"low1 "<<low<<"mid "<<mid<<endl;
MSort(r1,mid+1,high,r2);
//cout<<"low2mid "<<mid+1<<"high "<<high<<endl;
Merge(r2,low,mid,high,r3);
//cout<<"low "<<low<<"mid "<<mid<<"high "<<high<<endl;
}
//free(r2);
}
void MergeSort(type r[],int n){
MSort(r,1,n,r);
}
int main(){
type a[N];
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i].key;
MergeSort(a,n);
for(int i=1;i<=n;i++)
cout<<a[i].key<<" ";
return 0;
}
将两个或两个以上的有序表合成一个新的有序表
首先将n个记录看成n个有序的子序列,每个子序列的长度为1
然后两两归并得到n/2个长度为2的有序子序列,再在此基础上,
对长度为二的进行两两归并,得到若干个长度为4的有序子序列。
如此重复,直到得到一个长度为n的有序序列为止*/
#include<iostream>
#include<cstdlib>
using namespace std;
#define N 100
typedef int KeyType;
typedef char OtherType;
typedef struct RecordType{
KeyType key;
OtherType other_data;
}type;
void Merge(type r1[],int low,int mid,int high,type r2[]){
int i=low;
int j=mid+1;
int k=low;
while((i<=mid)&&(j<=high)){
if(r1[i].key<=r1[j].key){
r2[k]=r1[i];
i++;
}
else{
r2[k]=r1[j];
j++;
}
k++;
}
while(i<=mid){
r2[k]=r1[i];
k++;
i++;
}
while(j<=high){
r2[k]=r1[j];
k++;
j++;
}
//cout<<"merge"<<endl;
}
void MSort(type r1[],int low,int high,type r3[]){
type* r2;
r2=(type* )malloc(sizeof(type)*(high-low+1));
if(low==high){
r3[low]=r1[low];
//cout<<"Msort"<<endl;
}
else{
int mid=(low+high)/2;
MSort(r1,low,mid,r2);
//cout<<"low1 "<<low<<"mid "<<mid<<endl;
MSort(r1,mid+1,high,r2);
//cout<<"low2mid "<<mid+1<<"high "<<high<<endl;
Merge(r2,low,mid,high,r3);
//cout<<"low "<<low<<"mid "<<mid<<"high "<<high<<endl;
}
//free(r2);
}
void MergeSort(type r[],int n){
MSort(r,1,n,r);
}
int main(){
type a[N];
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i].key;
MergeSort(a,n);
for(int i=1;i<=n;i++)
cout<<a[i].key<<" ";
return 0;
}