zoukankan      html  css  js  c++  java
  • 算法导论——第一部分——基础知识

    第二章: 

    1/ 插入排序:原址,复杂度为n^2

      最佳运行时间为线性,最坏情况为n^2 

    void sort_array(int  *array )
    {
        int size = 7;
        cout << "the size is " << size<<endl;
        int key;
        for (int j = 1; j < size; j++)              
        {
            key = array[j];                   // key is  in  vector as the j's number
            int i = j - 1;
            while (i>=0 && key < array[i])    //  insert the key in the j-1's already sorted number 
            {                                 //  in the right order . 
                array[i + 1] = array[i];
                i = i - 1;            
            }            
            array[i + 1] = key;
        }
        for (int k = 0; k <7; k++)
            cout << array[k] << endl;
        cout << "end of the sort" << endl;
    }

    2/ 归并排序(merge sort):需要另外开辟n个存储空间  复杂度: nlgn

      merge : 假设merge的两个数串都是已经排序好的数

    void merge(int *A, int p, const int q, const int r)
    {
        if (p > q || q > r )
            cout << "data erro in merge" << endl;
        else
        {
            const int n1 = q - p + 1;
            const int n2 = r - q;
            int *L = new int[n1 + 1];
            int *R = new int[n2 + 1];
            for (int i = 0; i < n1; i++)
                *(L + i) = *(A + p + i);
            for (int j = 0; j < n2; j++)
                *(R + j) = *(A + q + 1 + j);
            *(L + n1) = 0xfffffff;
            *(R + n2) = 0xfffffff;
            int i = 0, j = 0;
            for (int m = 0; m <= r - p; m++)
            {
                if (*(L + i)>*(R + j))
                {
                    *(A +p+m) = *(R + j);
                    j++;
                }
                else
                {
                    *(A+p+m) = *(L + i);
                    i++;
                }
            }
            delete[]L;
            delete[]R;
        }
    }
    void merge_sort(int *A, const int p, const int r)
    {
        if (p >r)
            cout << "data error int sort" << endl;
        else 
        {
            int q = (p + r) / 2;
            if (q == p || q == r)
            {
                if (*(A + r) < *(A + p))
                {
                    int temp = *(A+r);
                    *(A + r) = *(A + p);
                    *(A + p) = temp;
                }
                return;
            }
            else
            {
                merge_sort(A, p, q);
                merge_sort(A, q + 1, r);
                merge(A, p, q, r);
            }
        }
    }

    3、 最大子数组问题:  求一个数组中后一个元素与它之前的任意一个元素的差的最大值(股票最大利润) 假设分别为 m , n

    a/   暴力求解: n^2

    b/   分治策略: nlgn 采用递归解决

      将原来数组分解为两个数组,出现两种情况: 

        m在后一个数组,n在前一个数组。  m: 后一个数组的最大值   n:前一个数组的最小值

    c/  将原来数组转换为连续值得差值,求子数组和最大的子数组

      如:  10,11,7,10,6  转换为: 1 ,-4 ,3, -4  定义一个sum如果前面的和为小于0则丢弃,从新开始新的数组

    int max(int *a , int n){
        if (n <= 1) return 0;
        int *b = new int(n-1);
        int sum ,max ;
        for (int i = 1; i < n; i++)
            *(b + i - 1) = *(a + i) - *(a+i-1);
        sum = *b;
        max = *b;
        for (int i = 0; i < n - 1; i++){
            if (sum <= 0){
                sum = 0;
            }
            else{
                if (max < sum) max = sum;
                sum = sum + *(b + i);
            }
        }
    }

     4、 用主方法求解递归公式

    在用递归解决问题时,常会用到递归公式,主定理用于求解递归公式的复杂度。

        T(n)  = aT(n/b) + f(n);

    三种情况的判断标准: f(n) 和 n^(lg a / lg b )  的复杂度 大小

                               

    证明略, 部分可参考: http://www.cnblogs.com/SBSOI/p/5640663.html

  • 相关阅读:
    用mkdirs创建目录
    关于布局(Layout)的一切
    用HTTP操作和文件操作把网页下载到sd卡
    OpenStack计费项目Cloudkitty系列详解(一)
    OpenStack/Gnocchi简介——时间序列数据聚合操作提前计算并存储起来,先算后取的理念
    python-RabbitMQ
    1go基本语法
    openstack多region配置
    cinder 挂载卷和 iSCSI原理
    Host aggregate分区
  • 原文地址:https://www.cnblogs.com/NeilZhang/p/5647093.html
Copyright © 2011-2022 走看看