归并排序核心思想:
分段排序,从小段到大段逐次进行排序
排序时两个子段从下标处开始,将小数存入新数组,最后用新数组覆盖原数组即可
#include <bits/stdc++.h>
using namespace std;
int a [ 10001100 ] , tmp [ 10001010 ];
void merge_sort ( int l , int r ) {
if ( l >= r ) return ;
int mid = ( l + r ) >> 1 ;
merge_sort ( l , mid ) ;
merge_sort ( mid + 1 , r ) ;
int m = 1 , x = l , y = mid + 1 ;
while ( x <= mid && y <= r ){
if ( a[ x ] >= a [ y ] ) tmp [ m++ ] = a [ y++ ] ;
else tmp [ m++ ] = a [ x++ ] ;
}
while ( x <= mid ) tmp [ m++ ] = a [ x++ ] ;
while ( y <= r ) tmp [ m++ ] = a [ y++ ] ;
for ( int i = l ; i <= r ; i ++ ) a [ i ] = tmp [ i - l + 1 ] ;
}
int main(){
int n ; cin >> n ;
for ( int i = 1 ; i <= n ; i++ ) cin >> a [ i ] ;
merge_sort ( 1 , n ) ;
for ( int i = 1 ; i <= n ; i++ ) cout << a [ i ] << " ";
return 0 ;
}