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