/** * 归并(Merge)排序法是将两个有序表合并成一个新的有序表,即把待排序 * 序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为 * 整体有序列。算法时间复杂度为O(nlog(n)),空间复杂度为O(n)。 */ #include <stdio.h> #include <stdlib.h> #include <assert.h> void sort(int array[], int tmp_array[], int low, int mid, int high) { int lpos = low, rpos = mid + 1, index = low; // 开始归并有序子序列 while(lpos <= mid && rpos <= high ) { if(array[lpos] < array[rpos]) tmp_array[index++] = array[lpos++]; else tmp_array[index++] = array[rpos++]; } while(lpos <= mid) tmp_array[index++] = array[lpos++]; while(rpos <= high) tmp_array[index++] = array[rpos++]; // 将排序好的预分配空间中的数据copy回原数组 for(int i = low; i <= high; ++i) array[i] = tmp_array[i]; } void merge(int array[], int tmp_array[], int low, int high) { int mid; if(high > low) { mid = (low + high) / 2; merge(array, tmp_array, low, mid); merge(array, tmp_array, mid + 1, high); sort(array, tmp_array, low, mid, high); } } void merge_sort(int array[], int n) { // 预分配存储空间,用于临时存储归并后的有序子序列 int * tmp_array = malloc(n * sizeof (int)); assert(tmp_array); merge(array, tmp_array, 0, n - 1); // 释放预分配存储空间 free(tmp_array); } main() { int array[] = {5, 6, 7, 1, 7, 100}; merge_sort(array, 6); for(int i = 0; i < 6; ++i) printf("%d ", array[i]); } 运行结果: 1 5 6 7 7 100