独学でノートを並べ替える

18322 ワード

ソートアルゴリズムはノートを勉強し、本を読んで勝手に書いて、意味があります.
 

  
  
  
  
  1. #include <algorithm> 
  2. #include <list> 
  3. #include <vector> 
  4. #include <iostream> 
  5. #include <string> 
  6.  
  7. void InsertionSort( std::list< std::string > & ls ) ; 
  8. void InsertAndKeepOrder( std::list< std::string > &ls, const std::string& str ) ;  
  9. void SelectionSort( std::list< std::string > & ls) ; 
  10. //void ShellSort( std::list< std::string> &ls ) ; 
  11. void QuickSort( std::list< std::string > &ls ) ; 
  12. void MergeSort( std::list< std::string > &ls ) ; 
  13. void Print( const std::list< std::string > &ls ) ; 
  14.  
  15. int main( int argc, char* argv[] ) { 
  16.  
  17.   std::list< std::string > ls ; 
  18.   ls.push_back( "zera" ) ; 
  19.   ls.push_back( "b" ) ; 
  20.   ls.push_back( "e" ) ; 
  21.   ls.push_back( "a" ) ; 
  22.   ls.push_back( "f" ) ; 
  23.   ls.push_back( "go" ) ; 
  24.   ls.push_back( "make" ) ; 
  25.   ls.push_back( "hello" ) ; 
  26.   ls.push_back( "alalalal" ) ; 
  27.   ls.push_back( "sony" ) ; 
  28.   ls.push_back( "apple" ) ; 
  29.   ls.push_back( "yahoo" ) ; 
  30.   ls.push_back( "google" ) ; 
  31.   ls.push_back( "microsoft" ) ;  
  32.  
  33.   std::cout << "before sorting: " <<  std::endl ;  
  34.   Print( ls ) ;  
  35.  
  36.   // InsertionSort( ls ) ; 
  37.   // SelectionSort( ls ) ; 
  38.   // ShellSort( ls ) ; 
  39.   // std::sort( ls.begin(), ls.end() ) ; 
  40.   // QuickSort( ls ) ; 
  41.   MergeSort( ls ) ;  
  42.    
  43.   std::cout << "after sorting: " << std::endl ; 
  44.   Print( ls ) ; 
  45.    
  46.   return 0 ; 
  47.  
  48. void InsertionSort( std::list< std::string > &ls ) { 
  49.   std::list< std::string > temp ; 
  50.   std::string s ; 
  51.   for( std::list< std::string >::iterator it = ls.begin() ; it != ls.end() ; ++it ) { 
  52.     s = (*it) ; 
  53.     InsertAndKeepOrder( temp, s ) ; 
  54.   } 
  55.   ls = temp ;  
  56.  
  57. void InsertAndKeepOrder( std::list< std::string > &ls, const std::string& str ) { 
  58.   std::list< std::string >::iterator it = ls.begin() ; 
  59.   while( it != ls.end() && (*it) < str ) { 
  60.     ++it ; 
  61.   } 
  62.   ls.insert( it, str ) ; 
  63.  
  64. void SelectionSort( std::list< std::string > &ls ) { 
  65.   std::list< std::string>::iterator b = ls.begin() ; 
  66.   std::list< std::string>::iterator smallest = ls.begin() ; 
  67.   std::string tempSwap ; 
  68.   std::list< std::string>::iterator it ; 
  69.   while( b != ls.end() ) {  
  70.     for( it = b ;  it != ls.end() ; ++it ) { 
  71.       if( (*it) < (*smallest) ) { 
  72.     smallest = it ; 
  73.       } 
  74.     } 
  75.     //swap 
  76.     tempSwap = *b ; 
  77.     *b = *smallest ; 
  78.     *smallest = tempSwap ; 
  79.  
  80.     smallest = (++b) ;  
  81.   } 
  82.  
  83. // void ShellSort( std::list< std::string > &ls ) { 
  84. //   int step ; 
  85. //   std::list< std::string > temp ; 
  86. //   unsigned int it ; 
  87. //   unsigned int startPoint ; 
  88.  
  89. //   for( step = 5 ; step != -1 ; step -= 2 ) { 
  90. //     for( int i = 0 ; i < step ; ++i ) { 
  91. //       startPoint = i ; 
  92. //       it = startPoint ; 
  93. //       while( it < ls.size() ) { 
  94. //  temp.push_back( ls[it] ) ; 
  95. //  it += step ; 
  96. //       } 
  97. //       InsertionSort( temp ) ; 
  98.  
  99. //       it = startPoint ; 
  100. //       for( unsigned int i = 0 ; i < temp.size() ; ++i ) { 
  101. //  ls[ it ] = temp[ i ] ; 
  102. //  it += step ; 
  103. //       } 
  104. //       temp.clear() ; 
  105. //     } 
  106. //   }             
  107. // } 
  108.  
  109. void QuickSort( std::list< std::string > &ls ) { 
  110.   if( ls.empty() or ( ls.size() == 1 ) ) { 
  111.     return ; 
  112.   } 
  113.   std::list< std::string> result ; 
  114.   std::string temp ; 
  115.   std::string pivot = ls.front() ; 
  116.   ls.pop_front() ;  
  117.   std::list< std::string > subLeft ; 
  118.   std::list< std::string > subRight ; 
  119.   for( std::list< std::string >::iterator it = ls.begin() ; it != ls.end() ; ++it ) { 
  120.     temp = (*it) ; 
  121.     if( temp < pivot ) { 
  122.       subLeft.push_back( temp ) ; 
  123.     } 
  124.     else { 
  125.       subRight.push_back( temp ) ; 
  126.     } 
  127.   } 
  128.   QuickSort( subLeft ) ; 
  129.   QuickSort( subRight ) ; 
  130.  
  131.   //combine together 
  132.   result.merge( subLeft ) ; 
  133.   result.push_back( pivot ) ; 
  134.   result.merge( subRight ) ; 
  135.   ls = result ;  
  136.  
  137. void MergeSort( std::list< std::string > &ls ) { 
  138.   if( ls.empty() or ( ls.size() == 1 ) ) { 
  139.     return ; 
  140.   } 
  141.   std::vector< std::string > l( ls.begin(), ls.end() ) ;  
  142.   unsigned int spiltter = l.size() / 2 ; 
  143.   std::list< std::string> left ; 
  144.   std::list< std::string> right ; 
  145.   std::list< std::string> result ; 
  146.   std::string temp ; 
  147.   //devide 
  148.   for( unsigned int i = 0 ; i < l.size() ; ++i ) { 
  149.     temp = l[i] ; 
  150.     if( i < spiltter ) { 
  151.       left.push_back( temp ) ; 
  152.     } 
  153.     else { 
  154.       right.push_back( temp ) ; 
  155.     } 
  156.   } 
  157.   MergeSort( left ) ; 
  158.   MergeSort( right ) ; 
  159.  
  160.   //now merge; 
  161.   std::list< std::string>::iterator  leftIterator = left.begin() ; 
  162.   std::list < std::string>::iterator rightIterator = right.begin() ; 
  163.   while( leftIterator != left.end() and rightIterator != right.end() ) { 
  164.     if( (*leftIterator) < (*rightIterator ) ) { 
  165.       temp = (*leftIterator ) ; 
  166.       ++leftIterator ;  
  167.     } 
  168.     else { 
  169.       temp = (*rightIterator) ;  
  170.       ++rightIterator ; 
  171.     } 
  172.     result.push_back( temp ) ;  
  173.   } 
  174.   if( leftIterator == left.end() ) { 
  175.     std::list< std::string > tempList( rightIterator, right.end() ) ; 
  176.     result.merge( tempList ) ;  
  177.   } 
  178.   if( rightIterator == right.end() ) { 
  179.     std::list< std::string > tempList( leftIterator, left.end() ) ;  
  180.     result.merge( tempList ) ; 
  181.   } 
  182.   ls = result ;  
  183.  
  184. void Print( const std::list< std::string > &ls ) { 
  185.   for( std::list< std::string >::const_iterator it = ls.begin() ; it != ls.end() ; ++it ) { 
  186.     std::cout << (*it) << std::endl ; 
  187.   }