数据结构--绪论

故事扮演 提交于 2020-02-26 16:38:10

数组求和的迭代和递归求法

迭代版本

int SUMI(int A[], int n) {
    int sum = 0;                   //O(1)
    for (int i = 0;i < n;i++) {    //n
        sum += A[i];               // O(1)
    }
    return sum;                   // O(1)
}   

递归版本

int SUM2(int A[], int n) {                     //线性递归,采取递归跟踪的策略
    return                                     //也可以采取递归方程
        (n < 1) ? 0 : SUM2(int A[], int n - 1) + A[n - 1];
}
//T( ) = O(1) * (N+1) = O(n)

数组倒置递归版本

void reverse(int* A, int lo, int hi) {            //数组倒置递归版本
    if (lo < hi) {
        swap(A[lo], A[hi]);
        return reverse( A, int lo + 1, int hi - 1);
    }
    else return;                          //  这个就是递归基啊,lo >= hi 都不行的。
}

分而治之版数组求和

int SUM(int A[], int lo, int hi) {           //分治版数组求和
    if (lo == hi)return A[lo];
    int mid = (lo + hi) >> 1;
    return SUM(A, lo, mid) + SUM(A, mid+1, hi);
}

求数组最大值次大值的三种方法

三趟循环

void max2(int A[], int lo, int hi, int& x1, int& x2) {         //三趟循环,找出了最大的元素和次大的元素
    for (x1 = lo, int i = lo + 1;i < hi;i++) {
        if (A[x1] < A[i])x1 = i;
    }
    for (x2 = lo, int i = lo + 1;i < x1;i++) {
        if (A[x2] < A[i])x2 = i;
    }
    for (int i = x2 + 1;i < hi;i++) {
        if (A[x2] < A[i])x2 = i;
    }
}

一次循环

void max22(int A[], int lo, int hi, int& x1, int& x2) {         //找最大元素次大元素第二种版本
    if (A[x1 = lo] < A[x2 = lo + 1])swap(x1, x2);
    for (int i = lo + 2;i < hi;i++) {
        if (A[x2] < A[i])
            if (A[x1] < A[x2 = i])
                swap(x1, x2);
    }
}

二分递归

void max222(int A[], int lo, int hi, int& x1, int& x2) {          //找最大值次大值的二分递归版本
    if (lo + 1 == hi) {
        if (A[lo] > A[hi]) {
            x1 = lo, x2 = hi;
            return;
        }
        else {
            x1 = hi, x2 = hi;
            return;
        }
    }
    if (lo + 2 == hi) {
        if (A[lo] > A[lo + 1]) {
            x1 = lo, x2 = lo + 1;
        }
        else {
            x1 = lo + 1, x2 = lo;
        }
        if (A[x2] < A[hi]) {
            if (A[x1] < A[x2 = hi])
                swap(x1, x2);
        }
        return;
    }
    int mid = (lo + hi) / 2;
    int x1L, x2L;max222(A, lo, mid, x1L, x2L);
    int x1R, x2R;max222(A, mid, hi, x1R, x2R);
    if (A[x1L] > A[x1R]) {
        x1 = x1L;
        x2 = (A[x2L] > A[x1R]) ? x2L : x1R;
    }
    else {
        x1 = x1R;
        x2 = (A[x1L] > A[x2R]) ? xlL : x2R;
    }
}

斐波那契数列的迭代与递归版本

迭代

int fib(n) { return (2 > n) ? n : fib(n - 1) + fib(n - 2); }        //斐波那契数列的递归版本

递归

int f = 0, g = 1;   // 第0项,第1项。                      斐波那契迭代版本
while (0 < n--) {
    g = g + f;        //f(n) = f(n-1)+f(n-2)
    f = g - f;        //f(n-1) = f(n) - f(n-2)
}

关于第一章内容,还有斐波那契数列的递归优化算法和动态规划求最长子序列没有完成。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!