1. 归并排序介绍
归并排序的原则是分治法,里面有递归和合并的概念,时间复杂度是O(nlgn)。
2. 归并排序的实现
#include <iostream> #include <vector> using namespace std; void inputNumbers(vector<int> &arrays){ cout<<"Please input numbers:"; int num; while(cin>>num){ arrays.push_back(num); } cout<<endl; } void mergeSortImpl(vector<int>&arrays, int begin, int end); void mergeSort(vector<int> &arrays){ mergeSortImpl(arrays, 0, arrays.size()-1); } void outputNumbers(const vector<int> &arrays){ cout<<"The sorted nubers: "; for(vector<int>::const_iterator iter=arrays.begin(); iter!=arrays.end(); ++iter) cout<<*iter<<" "; cout<<endl; } void mergeTwo(vector<int> &arrays, int begin, int middle, int end){ int array1[middle - begin + 1]; int array2[end - middle]; int index=0; for(int i=begin; i!=(middle+1); ++i) array1[index++] = arrays[i]; index = 0; for(int i=middle+1; i!=end+1; ++i) array2[index++] = arrays[i]; int i = 0; int j = 0; int k = begin; while(i!=middle-begin+1 && j!=end-middle){ arrays[k] = array1[i]<array2[j]?array1[i++]:array2[j++]; ++k; } while(i!=middle-begin+1) arrays[k++] = array1[i++]; while(j!=end-middle) arrays[k++] = array2[j++]; } void mergeSortImpl(vector<int>&arrays, int begin, int end){ if(begin < end){ int middle = (begin + end)/2; mergeSortImpl(arrays, begin, middle); mergeSortImpl(arrays, middle+1, end); mergeTwo(arrays, begin, middle, end); } } int main(){ vector<int> arrays; //input numbers inputNumbers(arrays); //mergesort mergeSort(arrays); //output numbers outputNumbers(arrays); return 0; }
3. 测试
Please input numbers:12 34 56 11 22 33 689 321
The sorted nubers: 11 12 22 33 34 56 321 689
The sorted nubers: 11 12 22 33 34 56 321 689