#include <stdio.h>
#include <stdlib.h>
typedef int T;
void merge(T _elem[], int lo, int mi, int hi)
{
// lb, lc 作为待排序数组左右两块的边界哨兵
int lb = mi - lo, lc = hi - mi;
// 开辟一个临时的空间用于存储前半段待排序数组
T* B = (T* )malloc(sizeof(T)*lb);
// 将前半段待排序数组复制到临时空间 B 中
for (int i = 0; i < lb; i++) B[i] = _elem[i];
// 待排序数组的后半段为 C
T* C = _elem + mi;
// B[j]和C[k]中的小者续至A末尾
for (int i = 0, j = 0, k = 0; j < lb || k < lc;)
{
if (j < lb && (lc <= k || B[j] <= C[k])) _elem[i++] = B[j++];
if (k < lc && (lb <= j || C[k] < B[j])) _elem[i++] = C[k++];
}
free(B);
}
void mergeSort(T _elem[], int lo, int hi)
{
if (hi - lo < 2) return;
int mi = (lo + hi) >> 1;
mergeSort(_elem, lo, mi);
mergeSort(_elem, mi, hi);
merge(_elem, lo, mi, hi);
}
int main()
{
T elem[19] = {53, 130, 120, 14, 206, 31, 380, 39, 402, 146, 491, 51, 54, 59, 722, 79, 82, 186, 92};
mergeSort(elem, 0, 19);
for (int i = 0; i < 19; i++)
printf("%d\t", elem[i]);
return 0;
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.