算法导论——第一部分——基础知识

第二章: 

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

原文地址:https://www.cnblogs.com/NeilZhang/p/5647093.html