第一版 第 8 章 :  程式碼  40




解答 :
#include <iostream>

using namespace std ;

void  swap( int &a , int &b ) {
      int n = a ;
      a = b ;
      b = n ;
}
 
void  merge( int *a , int s1 , int s2 ) {

    int  s = s1 + s2 ;
    int  *b = new int[s] ;
    
    int i , j ;
    
    i = 0 ; j = s1 ;
    for ( int n = 0 ; n < s ; ++n ) {
        if ( i == s1 ) {
           b[n] = a[j++] ;
        } else if ( j == s ) {
           b[n] = a[i++] ;
        } else {
           b[n] = ( a[i] < a[j] ? a[i++] : a[j++] ) ;
        }   
    } 

    for ( i = 0 ; i < s ; ++i ) a[i] = b[i] ; 
    delete [] b ;  
}


void  merge_sort( int *a , int s ) {
      if ( s == 2 && a[0] > a[1] ) {
           swap(a[0],a[1]) ;
      } else if ( s > 2 ) {
           int  first_half = s/2 ;
           int  second_half = s - first_half ;  
           merge_sort( a , first_half ) ;
           merge_sort( a+first_half , second_half ) ;
           merge( a , first_half , second_half ) ;     
      }      
}
 
int main() {
    
    const int S = 9 ;
    int no[S] = { 3 , 1 , 5 , 2 , 8 , 2 , 4 , 7 , 6} ;

    merge_sort( no , S ) ;
    for ( int i = 0 ; i < S ; ++i ) cout << no[i] << " " ;
    cout << endl ;
    
    return 0 ;
}