分治算法二:归并排序
一、算法思想:
(1)将原始序列拆分成两个序列()——分解过程;
(2)针对拆分后的序列,利用归并算法递归处理,进一步拆分,直到不能拆分为止,即仅一个元素——最小问题,治理;
(3)利用合并两个有序序列方法,将(2)中的最小问题逐个组合,最终组合成问题的解 —— 合并
(4)整个过程,是真的在分解整个序列,完美地体现了分治思想。
二、代码实现:
mergeSort函数实现,请参考合并两个有序序列
int mergeSort(void *array, int size, int p, int r, int(*cmp)(void *, void *))
{
int q;
if (p < r) {
// 序列分解
q = (p + r) / 2;
// 针对分解后的序列,递归处理
mergeSort(array, size, p, q, cmp);
mergeSort(array, size, q + 1, r, cmp);
// 合并两个有序的序列arrar[p...q]、array[q+1...r],生成最终解
mergeTwoList(array, size, p, q, r, cmp);
}
}
三、测试结果:
测试代码:
static void printfList(char *info, int *array, int len)
{
printf("%s", info);
for(int i = 0; i < len; i++) {
printf("%d ", array[i]);
}
printf("\n");
return;
}
int intGreater(void *x, void *y)
{
return *(int *)x - *(int *)y;
}
int main(void)
{
//int array[ARREY_LEN] = {9, 4, 7, 9, 2, 3, 5, 6, 8, 10};
int array[ARREY_LEN] = {9, 8, 1, 6, 5, 7, 3, 2, 4, 0};
int ret;
printfList("list before mergeSort: ", array, ARREY_LEN);
ret = mergeSort(array, sizeof(int), 0, ARREY_LEN - 1, intGreater);
if (ret != 0) {
printf ("mergeSort list faile.\n");
}
printfList("list after mergeSort: ", array, ARREY_LEN);
while (1);
return 0;
}
测试结果: