冒泡算法的学习
冒泡算法最简单的排序实现,大概是每个学习计算机同仁第一个接触的算法
本人是在大一的时候就学习了,现在我们先来复习下冒泡算法
冒泡算法基本思想:相邻两个元素比较,若满足条件则交换。现在用PHP可表示为
//冒泡排序
1 function fakeBubbleSort($arr){
2 for($i=0,$len=count($arr) ;$i<$len ;$i++){
3 for($j=$i+1 ;$j<$len ;$j++){
4 if($arr[$i] < $arr[$j]){
5 list($arr[$i] ,$arr[$j]) = array($arr[$j],$arr[$i]) ;
6 }
7 }
8 }
9 return $arr ;
10 }
2 for($i=0,$len=count($arr) ;$i<$len ;$i++){
3 for($j=$i+1 ;$j<$len ;$j++){
4 if($arr[$i] < $arr[$j]){
5 list($arr[$i] ,$arr[$j]) = array($arr[$j],$arr[$i]) ;
6 }
7 }
8 }
9 return $arr ;
10 }
让我们来看下,这是冒泡算法吗?冒泡算法要求:相邻元素交换,由加粗的部分我们看到,该算法思想是,循环数组,若后面任意元素大于当前则交换,虽然它实现了排序的操作,但是这不是冒泡排序。
下面我们来看下真正的冒泡排序
function bubbleSort($arr){
for ($i=0,$len=count($arr) ; $i<$len ;$i++){
for($j=$len-1 ;$j>$i ;$j--){
if($arr[$j]>$arr[$j-1]){
list($arr[$j] , $arr[$j-1]) = array($arr[$j-1] ,$arr[$j]);
}
}
}
return $arr ;
}
for ($i=0,$len=count($arr) ; $i<$len ;$i++){
for($j=$len-1 ;$j>$i ;$j--){
if($arr[$j]>$arr[$j-1]){
list($arr[$j] , $arr[$j-1]) = array($arr[$j-1] ,$arr[$j]);
}
}
}
return $arr ;
}
我们来看下真的冒泡,第一层循环仅用来限制循环的次数,第二个循环,将数组指针指向最后一个元素,并逐步与相邻元素比较并进行交换,符合冒泡排序的思想,但是新的问题又来了,若数组仅需要一次或少数几次交换就完成,这不还的把所有的元素都循环比较下,下面我们对这个算法优化下!
//改进的冒泡
1 function improveBubbleSort($arr){
2 $sortflag = true ;
3 for ($i=0,$len=count($arr) ; $i<$len && $sortflag ;$i++){
4 $sortflag = false ;
5 for($j=$len-1 ;$j>$i ;$j--){
6 if($arr[$j]>$arr[$j-1]){
7 list($arr[$j] , $arr[$j-1]) = array($arr[$j-1] ,$arr[$j]);
8 $sortflag = true ;
9 }
10 }
11 }
12 return $arr ;
13 }
2 $sortflag = true ;
3 for ($i=0,$len=count($arr) ; $i<$len && $sortflag ;$i++){
4 $sortflag = false ;
5 for($j=$len-1 ;$j>$i ;$j--){
6 if($arr[$j]>$arr[$j-1]){
7 list($arr[$j] , $arr[$j-1]) = array($arr[$j-1] ,$arr[$j]);
8 $sortflag = true ;
9 }
10 }
11 }
12 return $arr ;
13 }
这就是改进的冒泡算法,我们设置了一个标识,来判断是否还有必要进行下面的排序,加粗的部分说明,如果没有进行交换,我们认为剩余都是已经排好序的!直接跳出循环即可!
最后说明下冒泡算法是所有排序算法中最简单的算法,但却是复杂度最高的算法O(n^2),不过冒泡算法是稳定的,学习算法一定要理解其中思想,而不是死记硬背代码!