分治算法二:归并排序

一、算法思想:

(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;
}

测试结果:

posted @ 2021-01-24 16:23  Pangolin2  阅读(96)  评论(0编辑  收藏  举报