C語言——歸併排序練習題

歸併(Merge)排序法是將兩個(或兩個以上)有序表合併成一個新的有序表,即把待排序序列分爲若干個子序列,每個子序列是有序的。然後再把有序子序列合併爲整體有序序列。

歸併排序是建立在歸併操作上的一種有效的排序算法。該算法是採用分治法(Divide and Conquer)的一個非常典型的應用。
將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱爲2-路歸併。

/*
使用隨機數列出一組數據,然後排序。
 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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章