算法思想:
假設有兩個人,每人手里都有一部分牌,而且每個人手中的牌都按大小順序排列好了。
那么,現在要把兩個人手中的牌合並到一起,並且合並后要從小到大依次排好,可以這樣做:
每個人都從手中拿出最小的牌,然后比較,誰的牌小就把該張牌放在桌面上,牌大的一方牌仍然拿在手中,待下次再比較。
下一次每個人又拿最小的牌進行比較,如此下去。。。直到一方手中的牌全部放在了桌面上,這時另一方就可以把牌按從小到大的順序全部放在桌面上了。
這時,桌面上的牌顯然是排好了序的。
這就是歸並排序法的主要思想。當然,有歸並,首先就得分割,得把手中的牌分到兩個人手中,然后分到四個人手中。。。
一直分到每人手中只有一張牌。然后才可以每兩個人進行合並,最后合並到一個人的手中。
c++實現:
#include <iostream> using namespace std; #define N 100 int g_array[N]; //存放輸入的數字 static int count; //存放元素的個數 // 初始化函數 void Initial() { cout << "請輸入元素的個數:"; cin >> count; cout << "請輸入" << count << "個元素:"; for(int i = 0; i < count; i ++) { cin >> g_array[i]; } } //合並函數 void Merge(int a[], int l, int m, int r) { int i = l, j = m+1, k = l; int b[N]; while(i <= m && j <= r) { if(a[i] <= a[j]) { b[k++] = a[i++]; } else { b[k++] = a[j++]; } } if(i > m) { for(int p = j; p <= r; p ++) { b[k++] = a[p]; } } else { for(int p = i; p <= m; p ++) { b[k++] = a[p]; } } //把b[]中排好的元素copy到a[]中 for(int q = l; q <= r; q ++) { a[q] = b[q]; } } // 歸並排序 遞歸算法表示 void MergeSort(int a[], int left, int right) { if(left < right) //數組至少要有兩個元素 { int i = (right + left)/2; MergeSort(a, left, i); MergeSort(a, i+1, right); Merge(a, left, i, right); //把left到right的元素排序好 } } //打印排好序的數組 void Print() { cout << "經過MergeSort后:"; for(int i = 0; i < count; i ++) { cout << g_array[i] << " "; } cout << endl; } int main() { Initial(); if(count > 1) { MergeSort(g_array, 0, count-1); Print(); } else if(count == 1) { Print(); } system("pause"); return 0; }