二路归并算法是一种经典的排序算法,基于分治思想,将一个无序序列分成两个子序列,分别对这两个子序列进行排序,然后将排好序的子序列合并成一个有序序列。以下提供两种不同风格的 C 语言实现代码。
### 实现一
```c
#include <stdio.h>
// 将有序的 sr[i...m]和 sr[m+1...n]归并为有序的 tr[i...n]
void merge(int sr[], int tr[], int i, int m, int n) {
int j, k;
for (j = m + 1, k = i; i <= m && j <= n; ++k)
if (sr[i] < sr[j])
tr[k] = sr[i++];
else
tr[k] = sr[j++];
while (i <= m)
tr[k++] = sr[i++];
while (j <= n)
tr[k++] = sr[j++];
}
// 将无序的 sr[s...t]归并为有序的 tr1[s...t]
void msort(int sr[], int tr1[], int s, int t) {
int m;
int tr2[100];
if (s == t)
tr1[s] = sr[s];
else {
m = (s + t) / 2;
msort(sr, tr2, s, m);
msort(sr, tr2, m + 1, t);
merge(tr2, tr1, s, m, t);
}
}
int main() {
int x[11] = {0, 1, 34, 56, 23, 40, 90, 78, 60, 100, 30};
int d[11], i;
msort(x, d, 1, 10);
for (i = 1; i <= 10; i++)
printf("%d ", d[i]);
return 0;
}
```
### 实现二
```c
#include <stdio.h>
#define maxSize 100
// 二路归并排序
void mergeSort(int A[], int low, int high) {
void merge(int A[], int low, int mid, int high);
if (low < high) {
int mid = (low + high) / 2;
mergeSort(A, low, mid);
mergeSort(A, mid + 1, high);
merge(A, low, mid, high);
}
}
// 把 A 中 low 到 mid 和 mid+1 到 high 归并成一段有序的序列
void merge(int A[], int low, int mid, int high) {
int temp[maxSize];
int i, j, k;
// 下面执行的基本操作次数为两端子序列长度之和
for (k = i = low, j = mid + 1; i <= mid && j <= high; ++k)
if (A[i] <= A[j])
temp[k] = A[i++];
else
temp[k] = A[j++];
while (i <= mid) {
temp[k] = A[i];
++k;
++i;
}
while (j <= high) {
temp[k] = A[j];
++j;
++k;
}
for (i = low; i <= high; ++i) {
A[i] = temp[i];
}
}
int main() {
int arr[] = {12, 11, 13, 5, 6, 7};
int n = sizeof(arr) / sizeof(arr[0]);
mergeSort(arr, 0, n - 1);
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
return 0;
}
```