归并排序是建立在归并操作上的一种有效的排序算法,时间复杂度是O(nlogn)。
它过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素a[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元,如下图所示。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int n; 5 6 /* 7 * 合并 8 */ 9 void Merge(int *source, int *target, int i, int m, int n) 10 { 11 int j, k; 12 for (j = m + 1, k = i; i <= m && j <= n; k++) 13 { 14 if (source[i] <= source[j]) 15 { 16 target[k] = source[i++]; 17 } 18 else 19 { 20 target[k] = source[j++]; 21 } 22 } 23 while (i <= m) 24 { 25 target[k++] = source[i++]; 26 } 27 while (j <= n) 28 { 29 target[k++] = source[j++]; 30 } 31 } 32 33 /* 34 * 归并排序 35 */ 36 void MergeSort(int *source, int *target, int s, int t) 37 { 38 int m, *temp; 39 if (s == t) 40 { 41 target[s] = source[s]; 42 } 43 else 44 { 45 temp = (int*) malloc(sizeof(int) * (t - s + 1)); 46 m = (s + t) / 2; 47 MergeSort(source, temp, s, m); 48 MergeSort(source, temp, m + 1, t); 49 Merge(temp, target, s, m, t); 50 } 51 } 52 53 int main() 54 { 55 int i; 56 int *array; 57 printf("请输入数组的大小:"); 58 scanf("%d", &n); 59 array = (int*) malloc(sizeof(int) * n); 60 printf("请输入数据(用空格分隔):"); 61 for (i = 0; i < n; i++) 62 { 63 scanf("%d", &array[i]); 64 } 65 MergeSort(array, array, 0, n - 1); 66 printf("排序后为:"); 67 for (i = 0; i < n; i++) 68 { 69 printf("%d ", array[i]); 70 } 71 printf(" "); 72 }