算法思想:
将数组前一半排序,再将数组后一半排序,最终将排序好的数组都归并到一类
#include <iostream> using namespace std; void Merge(int *s1, int *s2,int start,int middle, int end) { int p1 = start, p2 = middle+1, ret = 0; while( p1 <= middle && p2 <= end ) //s1[start,middle],s2[middle+1,end]归并至s2 { if( s1[p1] <= s1[p2] ) s2[ret++] = s1[p1++]; else s2[ret++] = s1[p2++]; } while( p1 <= middle ) s2[ret++] = s1[p1++]; while( p2 <= end) s2[ret++] = s1[p2++]; for(int i = 0; i < end-start + 1; ++i) //s2数组内容拷贝回s1 s1[start + i] = s2[i]; } void MergeSort(int *s1, int *s2, int start, int end) { if(start < end) { int middle = start + (end - start)/2; MergeSort(s1, s2, start, middle); //分成左右两半进行归并排序 MergeSort(s1, s2, middle+1, end); Merge(s1, s2, start, middle, end); //合并成同一个数组 } } int main() { int number; cin >> number; int *s1 = new int[number]; int *s2 = new int[number]; for(int i = 0; i < number; ++i) cin >> s1[i]; MergeSort(s1,s2,0,number-1); delete []s2; for(int i = 0; i < number; ++i) cout << s1[i] << " "; return 0; }