数据结构排序-归并排序

归并排序是建立在归并操作上的一种有效的排序算法,时间复杂度是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  }
原文地址:https://www.cnblogs.com/niceforbear/p/4534566.html