• 8.1 冒泡排序


    冒泡排序(Bubble Sort)是一种交换排序,算法执行的过程中,看起来像是小的数往上浮,或者是大的数往下沉,于是称之为冒泡排序;

    它的基本思想是:两两比较相邻记录的关键字,如果反序就交换,直到没有反序的记录为止。

    第一次循环,外循环中的 start 位于最顶端,此时可以将最小值 1 冒泡到最顶端,即start处(向上浮)

    第二次循环,外循环中的 start 位于索引2处,此时可以将最小值 1 冒泡到start处(向上浮)

    下面来分析一下冒泡排序的算法复杂度:

    需要的额外空间复杂度:由于是用有限的几个变量就能解决问题,故这里的空间复杂度为O(1),。

    对于时间复杂度:

    最好的情况就是排序表本身就是有序的,时间复杂度为O(n)。当最坏的情况发生时,排序表示逆序的,此时就需要比较 1 + 2 + 3 + 4 + ... =(n * (n - 1))次,并做等数量级的数据移动,因此总的时间复杂度是O(n * n)。

    下面是实现代码,使用了上浮和下沉两种方式:

    <?php
    header("content-type:text/html;charset=utf-8");
    /*
     * 冒泡法排序:两两比较,让大的数向下沉,或者让小的数往上浮
     * 思想:两两比较相邻记录的关键字,如果反序就交换,直到没有反序的记录为止。
     * 时间复杂度:O(N^2);额外空间复杂度O(1)
     *
     * */
    //第一种:大的数向下沉
    function bubbleSort1($arr = array()){
        if($arr==null || count($arr)<2){
            return true;
        }
        for($end = count($arr)-1;$end>0;$end--){ //大循环决定结束的位置end,每循环一次结束位置end就会前移一次
    
            for($i=0;$i<$end;$i++){
                if($arr[$i]>$arr[$i+1]){
                    swap($arr,$i,$i+1);
                }
            }
        }
        return $arr;
    }
    //第二种:小的数往上浮
    function bubbleSort2($arr){
        if($arr == null || count($arr)<2){
            return true;
        }
        else{
            for($start = 0;$start<count($arr)-1;$start++){   //大循环决定结束的位置start,每循环一次结束位置start就会后移一次
                for($i=count($arr)-1;$i > $start;$i--){
                    if($arr[$i] < $arr[$i-1]){
                        swap($arr,$i,$i-1);
                    }
                }
            }
        }
        return $arr;
    }
    
    function swap(&$arr,$i,$j){  //注意这里引用变量的使用
    
        $tem = $arr[$i];
        $arr[$i] = $arr[$j];
        $arr[$j] = $tem;
    }
    
    $arr = [2,33,45,22,64,67,12,1,0,9];
    $arr1 = bubbleSort1($arr);
    print_r($arr1);//输出结果:Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 9 [4] => 12 [5] => 22 [6] => 33 [7] => 45 [8] => 64 [9] => 67 )
    ?>
  • 相关阅读:
    WEB 应用缓存解析以及使用 Redis 实现分布式缓存
    MVC 架构模式
    用两个栈实现队列
    重建二叉树
    从尾到头打印链表
    替换空格
    二维数组中的查找
    二叉树与线索二叉树
    OpenYurt:延伸原生 Kubernetes 到边缘场景下的落地实践
    开放下载!解锁 Serverless 从入门到实战大“橙”就
  • 原文地址:https://www.cnblogs.com/xlzfdddd/p/10471929.html
Copyright © 2020-2023  润新知