归并排序大致上可以理解为把所有数拆分到最小单位,在每个小单位时进行排序,依次把这个小单位变大,然后再排序。一直到所有数。


上图中SR为函数形参时传入的数组,TR为临时数组。在本代码中,num数组为传入数组,t为临时数组。left在最左边,mid为上图的m,right在最右边。
1 #include<stdio.h>
2
3 void Merge(int num[],int t[],int left,int mid,int right){
4
5 int i = left; //i在左边
6 int j = mid + 1; //j在右边,对应上图
7 int k = i;
8
9 for(;i<=mid && j<=right;k++){ //i、j都是有界限的,k是临时数组存入的下标
10
11 if(num[i]<num[j]){ //找出较小的数依次存放到临时数组t中
12 t[k] = num[i]; //num[i]小就把这个数存入
13 i++; //然后在左边找下一个
14 }
15 else{
16 t[k] = num[j]; //num[j]小就把这个数存入
17 j++; //然后在右边找下一个
18 }
19 }
20
21 int l;
22 if(i<=mid) //当j全部存入后就把剩余的i部分也全存入
23 for(l=0;l<=mid-i;l++)
24 t[k+l] = num[i+l];
25 if(j<=right) //当i全部存入后就把剩余的j部分也全存入
26 for(l=0;l<=right-j;l++)
27 t[k+l] = num[j+l];
28
29 }
30
31 void MSort(int num[],int t[],int left,int right) { //t是存储排好序的数组
32
33 int t2[7]; //每次分半后到最小单位数存放在临时数组t2中
34 int m = (left+right)/2;
35
36 if(left==right)
37 t[m] = num[left]; //如果left、riht相同,则把这个位置上的数存放到临时数组
38 else{ //相同位置上 ,其实就是找到最小单位存入(拆分到1个)
39 MSort(num,t2,left,m); //如果不同,则分半递归继续寻找
40 MSort(num,t2,m+1,right);
41 Merge(t2,t,left,m,right); //当t2存放新数之后,就开始排序
42 }
43
44
45 }
46
47 void main(){
48
49 int i,num[7] = {12,13,0,21,10,5,7},t[7];
50 for(i=0;i<7;i++)
51 printf("%d ",num[i]);
52
53 printf("\n");
54 MSort(num,t,0,6);
55
56 for(i=0;i<7;i++)
57 printf("%d ",t[i]);
58
59
60 }