• 冒泡排序和递归算法优化


    冒泡排序

    第一,冒泡排序是原地排序算法吗?

    冒泡的过程只涉及相邻数据的交换操作,只需要常量级的临时空间,所以它的空间复杂度为 O(1),是一个原地排序算法。 

    第二,冒泡排序是稳定的排序算法吗?

    在冒泡排序中,只有交换才可以改变两个元素的前后顺序。为了保证冒泡排序算法的稳定

    性,当有相邻的两个元素大小相等的时候,我们不做交换,相同大小的数据在排序前后不会

    改变顺序,所以冒泡排序是稳定的排序算法。

    第三,冒泡排序的时间复杂度是多少?

    最好情况下,要排序的数据已经是有序的了,我们只需要进行一次冒泡操作,就可以结束 了,所以最好情况时间复杂度是 O(n)。而最坏的情况是,要排序的数据刚好是倒序

    排列 的,我们需要进行 n 次冒泡操作,所以最坏情况时间复杂度为 O(n2)。 

    冒泡排序优化(没有交换,提前退出)

    // 冒泡排序,a 表示数组,n 表示数组大小 
    public void bubbleSort(int[] a, int n) {
        if (n <= 1) return;
        for (int i = 0; i < n; ++i) {
            // 提前退出冒泡循环的标志位
            boolean flag = false;
            for (int j = 0; j < n - i - 1; ++j) {
                if (a[j] > a[j+1]) { // 交换 int tmp = a[j];
                a[j] = a[j+1];
                a[j+1] = tmp;
                flag = true; // 表示有数据交换 }
            }
            if (!flag) break; // 没有数据交换,提前退出 
        }
    }

     

    递归

    递归需要满足的三个条件:

    1. 一个问题的解可以分解为几个子问题的解,何为子问题?子问题就是数据规模更小的问题。

    2. 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样

    3. 存在递归终止条件:把问题分解为子问题,把子问题再分解为子子问题,一层一层分解下去,不能存在无限循环,这就需要有终止条件。

    基本公式

    f(n) = f(n-1)+f(n-2)

    递归代码要警惕重复计算

    除此之外,使用递归时还会出现重复计算的问题。例如 f(6) = f(5) + f(4) , f(7) = f(6) + f(5) , 可以看到计算f(6) 和 f(7) 的时候,明显的重复计算了f(5)。

    public int f(int n) {
        if (n == 1) return 1;
        if (n == 2) return 2;
        // hasSolvedList 可以理解成一个 Map,key 是 n,value 是 f(n)
        if (hasSolvedList.containsKey(n)) {
            return hasSovledList.get(n);
        }
        int ret = f(n-1) + f(n-2);
        hasSovledList.put(n, ret);
        return ret;
    }        

    递归还有很多其他问题,例如在时间效率上,递归代码里多了很多函数调用,当这些函数调用的数量较大时,就会积聚成 一个可观的时间成本。

     

  • 相关阅读:
    每天学点Linux-选取命令CUT和GREP
    每天学点Linux-切割命令split
    基于netty-socketio的web推送服务
    Redis学习-LUA脚本
    spring中InitializingBean接口使用理解
    外包采用Gradle生成多套app打包
    Android Studio 快捷键 for mac
    使用ClipboardUtils兼容API LEVEL 11以下实现复杂粘贴
    finished with non-zero exit 添加v7包报错的问题
    Infer初体验 for Android
  • 原文地址:https://www.cnblogs.com/zhenghongxin/p/13976529.html
Copyright © 2020-2023  润新知