zoukankan      html  css  js  c++  java
  • 算法导论 第二章 合并排序-分治算法

    /*
     * p,q,r是下标,满足p<=q<r,假设子糨能a[p..q]与a[q+1..r]已经排好序
     * 将两个合并排好序代替当前子数组A[p..r]
     * Running time: O(n) n = r-q+1 ÊÇÁœŽýºÏ²¢×ÓÊý×éÔªËصĞöÊýºÍ
     */
    void merge(int a[], int p, int q, int r)
    {
        int *left, *right;
        int n1, n2, i, j, k;
     
        n1 = q - p + 1;
        n2 = r - q;
     
        left = (int *)malloc(sizeof(int) * (n1+1));
        if (left == NULL)
            return ;
        right = (int *)malloc(sizeof(int) * (n2+1));
        if (right == NULL) {
            free(left);
            return ;
        }
     
        for (i = p, n1 = 0; i <= q; ++i, ++n1)
            left[n1] = a[i];
        for (i = q+1, n2 = 0; i <= r; ++i, ++n2)
            right[n2] = a[i];
     
        left[n1] = MAXVAL;
        right[n2] = MAXVAL;
     
        i = j = 0;
        for (k = p; k <= r; ++k) {
            if (left[i] < right[j])
                a[k] = left[i++];
            else
                a[k] = right[j++];
        }
     
        free(left);
        free(right);
    }
     
    /* 递归调用
     * O(nlgn)
     */
    void merge_sort(int a[], int p, int r)
    {
        int q;
        if (p < r) {
            q = (p + r) / 2;
            merge_sort(a, p, q);
            merge_sort(a, q+1, r);
            merge(a, p, q, r);
        }
    }

  • 相关阅读:
    实验2:Mininet实验——拓扑的命令脚本生成
    实验1:Mininet源码安装和可视化拓扑工具
    第一次博客作业
    数据采集第四次作业
    第7组(69)团队展示
    数据采集第三次作业
    结对作业
    数据采集第二次作业
    数据采集第一次作业
    第一次个人编程作业
  • 原文地址:https://www.cnblogs.com/huiqin/p/3674858.html
Copyright © 2011-2022 走看看