歸併(Merge)排序法是將兩個(或兩個以上)有序表合併成一個新的有序表,即把待排序序列分爲若干個子序列,每個子序列是有序的。然後再把有序子序列合併爲整體有序序列。
/*
使用隨機數列出一組數據,然後排序。
21 80 71 66 48 71 40 90 29 22 83 7 55 66 5 42
21 80
66 71
21 66 71 80
48 71
40 90
40 48 71 90
21 40 48 66 71 71 80 90
22 29
7 83
7 22 29 83
55 66
5 42
5 42 55 66
5 7 22 29 42 55 66 83
5 7 21 22 29 40 42 48 55 66 66 71 71 80 83 90
5 7 21 22 29 40 42 48 55 66 66 71 71 80 83 90
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 16
int a[N], b[N];
void init_array(int l, int r)
{
int i;
srand(time(NULL));
for (i=l; i<=r; i++) a[i] = rand()%100;
}
void show_array(int l, int r)
{
int i;
for (i=0; i<l; i++) printf(" ");
for (i=l; i<=r; i++) printf("%3d", a[i]);
printf("\n");
}
void merge(int l, int m, int r)
{
int i, j, k;
for (i=l; i<=r; i++) b[i] = a[i];
i = l; j = m+1; k = l;
while (i<=m && j<=r)
if (b[i]<b[j]) a[k++] = b[i++];
else a[k++] = b[j++];
while (i<=m) a[k++] = b[i++];
while (j<=r) a[k++] = b[j++];
}
void merge_sort(int l, int r)
{
if (l>=r) return;
int m = (l+r)/2;
merge_sort(l, m);
merge_sort(m+1, r);
merge(l, m, r);
show_array(l, r);
}
int main()
{
init_array(0, N-1);
show_array(0, N-1);
merge_sort(0, N-1);
show_array(0, N-1);
return 0;
}