使用C++容器vector實現的兩路歸併排序

這篇文章的目的是爲了讓後來者,也讓我自己,記住容器vector的一些操作。

RT.順便實現了計算number of inversions(其實這纔是重點)。

 

  1. /*Definition:Let A[1..n] be an array of 'n' distinct numbers. If i < j and A[i] > A[j], then the pair (i,j) is called an inversion of A. 
  2. */ 
  3. #include <iostream> 
  4. #include <stdlib.h> 
  5. #include <vector> 
  6. #include <fstream>
  7. #include <ctime> 
  8. using namespace std; 
  9. long long inversionNum = 0; 
  10. vector<int> mergeSort(vector<int> &i); 
  11. vector<int> merge(vector<int> &left, vector<int> &right); 
  12. int main(){ 
  13. time_t begin,end; begin=clock();
  14.     //read file,initial a integer vector 
  15.     vector<int> ivec(100000,0); 
  16.     vector<string> svec(100000); 
  17.     ifstream fin("beforeSort"); 
  18.     for (vector<string>::iterator sx = svec.begin(); sx != svec.end(); ++sx) 
  19.         getline(fin, *sx); 
  20.     fin.close(); 
  21.     //change it into integer 
  22.     for (int count = 0; count < 100000; ++count) 
  23.         ivec[count] = atoi(svec[count].c_str()); 
  24.     //merge sort 
  25.  
  26.     vector<int> result = mergeSort(ivec); 
  27.     ofstream fout("afterSort"); 
  28.     for(vector<int>::iterator rx = result.begin(); rx != result.end(); ++rx) 
  29.         fout << *rx << endl; 
  30.     fout.close(); 
  31.  
  32.     cout << "The number of inversions is:" << inversionNum << endl;
  33.  
  34. end=clock();
  35. cout<<"runtime: "<<double(end-begin)/CLOCKS_PER_SEC<<endl;
  36.     return 0; 
  37.  
  38. vector<int> mergeSort(vector<int>& i) { 
  39.     if ( i.size() == 1) 
  40.         return vector<int >(1, i[0]); 
  41.     if ( i.size() == 0){ 
  42.         return vector<int >(); 
  43.     } 
  44.  
  45.     vector<int>::iterator mid = i.begin() + i.size() / 2; 
  46.     vector<int> left(i.begin(), mid); 
  47.     vector<int> right(mid, i.end()); 
  48.  
  49.     left = mergeSort( left ); 
  50.     right = mergeSort( right ); 
  51.  
  52.     return merge( left, right); 
  53.  
  54. vector<int> merge(vector<int> &left, vector<int> &right) { 
  55.     vector<int> result; 
  56.     vector<int>::size_type li = 0, ri = 0; 
  57.     while ( li < left.size() && ri < right.size()) { 
  58.         if ( left[li] > right[ri] ) {   //inversion 
  59.             result.push_back(right[ri++]); 
  60.             inversionNum += (left.size() - li); 
  61.         } 
  62.         else { 
  63.             result.push_back(left[li++]); 
  64.         } 
  65.     } 
  66.     while ( li < left.size() ) { 
  67.         result.push_back(left[li++]); 
  68.     } 
  69.     while ( ri < right.size() ) { 
  70.         result.push_back(right[ri++]); 
  71.     } 
  72.     return result; 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章