递归的终结条件:子区间长度为1(一个记录自然有序)。
举例
无序数组[6 2 4 1 5 9]
先看一下每个步骤下的状态,完了再看合并细节
第一步 [6 2 4 1 5 9]原始状态
第二步 [2 6] [1 4] [5 9]两两合并排序,排序细节后边介绍
第三步 [1 2 4 6] [5 9]继续两组两组合并
第四步 [1 2 4 5 6 9]合并完毕,排序完毕
输出结果[1 2 4 5 6 9]
合并细节
详细介绍第二步到第三步的过程,其余类似
第二步:[2 6] [1 4] [5 9]
两两合并,其实仅合并[2 6] [1 4],所以[5 9]不管它,
原始状态
第一个数组[2 6]
第二个数组[1 4]
--------------------
第三个数组[...]
第1步,顺序从第一,第二个数组里取出一个数字:2和1
比较大小后将小的放入第三个数组,此时变成下边这样
第一个数组[2 6]
第二个数组[4]
--------------------
第三个数组[1]
第2步,继续刚才的步骤,顺序从第一,第二个数组里取数据,2和4,
同样的比较大小后将小的放入第三个数组,此时状态如下
第一个数组[6]
第二个数组[4]
--------------------
第三个数组[1 2]
第3步,再重复前边的步骤变成,将较小的4放入第三个数组后变成如下状态
第一个数组[6]
第二个数组[...]
--------------------
第三个数组[1 2 4]
第4步,最后将6放入,排序完毕
第一个数组[...]
第二个数组[...]
--------------------
第三个数组[1 2 4 6]
[ 1 2 4 6 ]与[ 5 9 ]的合并过程与上边一样,不再分解。
例题:
ARR[]= {32, 21, 67};
示意图如下:
代码:
// merge_sort.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> using namespace std; int d[100] = {0}; //int s[10] = {32, 21, 67, 11, 5, 43, 99, 18, 22, 87}; int s[10] = {32, 21, 67}; void merg(int L, int R) { int mid = (L + R)/2; int i = L, j = mid + 1, k = 0; //i表示前个区的第一个地址,j表示后一个区的第一个地址,k表示新地址 while (i <= mid && j <= R) { if(s[i] < s[j]) { d[k++]=s[i++]; } else { d[k++]=s[j++]; } } while(i<=mid)d[k++]=s[i++]; while(j<=R)d[k++]=s[j++]; for(i=L,k=0;i<=R;i++,k++) s[i]=d[k]; } void mergesort(int L,int R) { if (L < R) { int mid = (L + R)/2; mergesort(L, mid); mergesort(mid + 1, R); merg(L, R); } } int _tmain(int argc, _TCHAR* argv[]) { mergesort(0,2); for(int i = 0; i < 10; i++) { cout << s[i] << endl; } return 0; }