Advertisement
yuawn

algo2017_week4_Merge_Sort

Oct 18th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.31 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define pb push_back
  4. #define mp make_pair
  5. #define INF 1e9
  6. #define ALL(o) (o).begin(),(o).end()
  7. #define fo(n) for(int i=0;i<n;i++)
  8. #define fos(o,n) for(int i=o;i<n;i++)
  9. typedef long long LL;
  10. template<typename X> inline X sqr(const X& a) {return a * a;}
  11. template<typename X> inline X abs(const X& a) {return a < 0 ? -a : a;}
  12. #define MAX 65536
  13.  
  14. int x[MAX] , n;
  15. vector<int> p[16];
  16.  
  17. void print( int dep ){
  18.     fo( dep ){
  19.         cout << p[i][0];
  20.         for( int j = 1 ; j < n ; ++j ) cout << ' ' << p[i][j];
  21.         cout << endl;
  22.     }
  23. }
  24.  
  25. void Merge( int L , int M , int R ){
  26.     int l = L , r = M , tmp[ R - L + 1 ] , t = 0;
  27.    
  28.     while( l < M && r <= R ) tmp[t++] = x[l] < x[r] ? x[l++] : x[r++];
  29.    
  30.     if( l < M ) while( l < M ) tmp[t++] = x[l++];
  31.     else        while( r <= R ) tmp[t++] = x[r++];
  32.    
  33.     t = 0;
  34.     fos( L , R + 1 ) x[i] = tmp[t++];
  35. }
  36.  
  37.  
  38. void MergeSort( int L , int R , int dep ){
  39.     if( L >= R ) return;
  40.    
  41.     int mid = ( ( L + R ) >> 1 ) + 1;
  42.    
  43.     MergeSort( L , mid - 1 , dep - 1 );
  44.     MergeSort( mid , R , dep - 1 );
  45.     Merge( L , mid , R );
  46.    
  47.     fos( L , R + 1 ) p[dep].pb( x[i] );
  48. }
  49.  
  50. int main(){
  51.     ios::sync_with_stdio(false);
  52.     cin.tie(0);
  53.    
  54.     cin >> n;
  55.     int t = n;
  56.     n = pow( 2 , n );
  57.    
  58.     fo( n ) cin >> x[i];
  59.  
  60.     MergeSort( 0 , n - 1 , t - 1 );
  61.    
  62.     print( t );
  63.    
  64.     return 0;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement