歸並排序採用分治法策略,核心操作是「歸並」——將兩個已排序序列合併為一個有序序列。演算法遞迴將序列不斷二分(或多分)直到單元素,再自底向上合併。
/*=============================================================================
# FileName: Merge_Sort.c
# Desc: 歸並排序
# Author: zhangyuqing
# Created: 2014年6月29日
# Version: 0.0.1
=============================================================================*/
#include <stdlib.h>
#include <malloc.h>
// 歸並操作:將 src[low..mid] 和 src[mid+1..high] 合併到 des[low..high]
void merge(int src[], int des[], int low, int high, int mid) {
int i = low, k = low, j = mid + 1;
while ((i <= mid) && (j <= high)) {
if (src[i] < src[j])
des[k++] = src[i++];
else
des[k++] = src[j++];
}
while (i <= mid) des[k++] = src[i++];
while (j <= high) des[k++] = src[j++];
}
// 遞迴排序核心
void MSort(int src[], int des[], int low, int high, int max_size) {
if (low == high) {
des[low] = src[low];
} else {
int mid = (low + high) / 2;
int *des_space = (int *)malloc(sizeof(int) * max_size);
if (NULL != des_space) {
MSort(src, des_space, low, mid, max_size);
MSort(src, des_space, mid + 1, high, max_size);
merge(des_space, des, low, high, mid);
}
free(des_space);
}
}
// 對外介面
void Merge_Sort(int arr[], int low, int high, int len) {
MSort(arr, arr, low, high, len);
}
int main(void) {
int arr[10];
for (int i = 0; i < 10; i++)
arr[i] = rand() % 100;
printf("Before sort:\n");
for (int i = 0; i < 10; i++) printf("%d ", arr[i]);
Merge_Sort(arr, 0, 10 - 1, 10);
printf("\nAfter sort:\n");
for (int i = 0; i < 10; i++) printf("%d ", arr[i]);
system("pause");
return 0;
}
Before sort: 41 67 34 0 69 24 78 58 62 64 After sort: 0 24 34 41 58 62 64 67 69 78 請按任意鍵繼續. . .
註:本實現每次遞迴都分配臨時空間,可優化為僅分配一次全域暫存陣列以提升效能。