• 分治算法二:归并排序


    一、算法思想:

    (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("
    ");
        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.
    ");
        }
    
        printfList("list after mergeSort: ", array, ARREY_LEN);
    
        while (1);
        return 0;
    }
    

    测试结果:

  • 相关阅读:
    数组的地址和vector数组的地址
    字节跳动 测试开发工程师 面经
    最短路径树
    SPFA
    树的直径
    树的重心
    CF1401D Maximum Distributed Tree
    期望简述
    CF723E One-Way Reform
    CF1409E Two Platforms
  • 原文地址:https://www.cnblogs.com/HZL2017/p/14321278.html
Copyright © 2020-2023  润新知