C语言——归并排序练习题

来源:互联网 发布:java项目简介怎么写 编辑:程序博客网 时间:2024/05/16 15:13

归并(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 16int 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;}


原创粉丝点击