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 )
?>

 

posted @ 2019-03-04 17:24  小林子奋斗的点滴  阅读(327)  评论(0编辑  收藏  举报