C++實現歸併排序演算法
阿新 • • 發佈:2018-12-28
1.歸併排序 實現方法:
把長度為 n 的數列,每次簡化為兩個長度為 n/2 的數列,直至數列中剩一個元素後兩兩合併,直至所有都參與操作。
合併方法:比較兩個數列第一個元素,將最小的放在另一個數中C中,重複直至某數列為空,然後將另一個數列中元素都放入C陣列中
2.程式碼實現:
#include <iostream> #include <vector> using namespace std; // 拷貝陣列函式 // 將陣列SourceData的第BeginIndex個元素~第EndIndex個元素拷貝到另一個數組中,並返回 template <class T> vector<T> CopyVectorData(vector<T> &SourceData, int BeginIndex, int EndIndex) { vector<T> tempVec; for (int i = BeginIndex; i <= EndIndex; ++i) { tempVec.push_back(SourceData[i]); } return tempVec; } // 合併函式 // 將兩個陣列中的元素按照從小到大的形式放到另一個數組中,並返回 template <class T> vector<T> Merge(vector<T> &LeftData, vector<T> &RightData) { size_t leftIndex = 0; size_t rightIndex = 0; vector<T> resultData; while( (leftIndex < LeftData.size()) && (rightIndex < RightData.size())) { if ( LeftData[leftIndex] <= RightData[rightIndex]) { resultData.push_back(LeftData[leftIndex]); ++leftIndex; } else { resultData.push_back(RightData[rightIndex]); ++rightIndex; } } while(leftIndex < LeftData.size()) { resultData.push_back(LeftData[leftIndex]); ++leftIndex; } while(rightIndex < RightData.size()) { resultData.push_back(RightData[rightIndex]); ++rightIndex; } return resultData; } // 歸併排序 演算法 template <class T> vector<T> MergeSort(vector<T> &SortData) { if (SortData.size() == 1) { return SortData; } vector<T> leftData = CopyVectorData(SortData, 0, SortData.size()/2 - 1); vector<T> rightData = CopyVectorData(SortData, SortData.size()/2, SortData.size()-1); vector<T> resultData = Merge(MergeSort(leftData), MergeSort(rightData)); return resultData; } int _tmain(int argc, _TCHAR* argv[]) { int ia[] = {12, 20, 5, 10, 34, 49, 33, 88, 42, 12}; vector<int> Select(ia, ia+10); vector<int> Result = MergeSort(Select); system("pause"); return 0; }