算法思想:
假设有两个人,每人手里都有一部分牌,而且每个人手中的牌都按大小顺序排列好了。
那么,现在要把两个人手中的牌合并到一起,并且合并后要从小到大依次排好,可以这样做:
每个人都从手中拿出最小的牌,然后比较,谁的牌小就把该张牌放在桌面上,牌大的一方牌仍然拿在手中,待下次再比较。
下一次每个人又拿最小的牌进行比较,如此下去。。。直到一方手中的牌全部放在了桌面上,这时另一方就可以把牌按从小到大的顺序全部放在桌面上了。
这时,桌面上的牌显然是排好了序的。
这就是归并排序法的主要思想。当然,有归并,首先就得分割,得把手中的牌分到两个人手中,然后分到四个人手中。。。
一直分到每人手中只有一张牌。然后才可以每两个人进行合并,最后合并到一个人的手中。
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; }