#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int arr[100];
int n;
//排序
//归并排序 左排序右排序,归并(将两边最小的元素复制到原数组)
void merge(int arr[],int l,int mid,int r);
void mergeSort(int array[],int l,int r){
if(l<r){
int mid=(l+r)/2;
mergeSort(array,l,mid);
mergeSort(array,mid+1,r);
merge(array,l,mid,r);
}
}
void merge(int arr[],int l,int mid,int r){
int helperl=l;
int helperr=mid+1;
int helper[100];
for(int i=0;i<n;i++){
helper[i]=arr[i];
}
int k=l;
while(helperl<=mid&&helperr<=r)
{
if(helper[helperl]<=helper[helperr]){
arr[k]=helper[helperl];
helperl++;
}else {
arr[k]=helper[helperr];
helperr++;
}
k++;
}
for(int i=0;i<=mid-helperl;i++){
arr[k+i]=helper[helperl+i];
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>arr[i];
}
mergeSort(arr,0,n-1);
for(int i=0;i<n;i++){
cout<<arr[i]<<" ";
}
cout<<endl;
return 0;
}
来自程序员面试金典。
递归实现数组的归并排序。归并排序分两步,划分,归并。归并阶段创建辅助数组,将左半和右半最小的数依次写回原数组。