冒泡算法的学习

冒泡算法最简单的排序实现,大概是每个学习计算机同仁第一个接触的算法

本人是在大一的时候就学习了,现在我们先来复习下冒泡算法

冒泡算法基本思想:相邻两个元素比较,若满足条件则交换。现在用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 }

让我们来看下,这是冒泡算法吗?冒泡算法要求:相邻元素交换,由加粗的部分我们看到,该算法思想是,循环数组,若后面任意元素大于当前则交换,虽然它实现了排序的操作,但是这不是冒泡排序。

下面我们来看下真正的冒泡排序

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 ;
}


我们来看下真的冒泡,第一层循环仅用来限制循环的次数,第二个循环,将数组指针指向最后一个元素,并逐步与相邻元素比较并进行交换,符合冒泡排序的思想,但是新的问题又来了,若数组仅需要一次或少数几次交换就完成,这不还的把所有的元素都循环比较下,下面我们对这个算法优化下!

//改进的冒泡

 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 }

这就是改进的冒泡算法,我们设置了一个标识,来判断是否还有必要进行下面的排序,加粗的部分说明,如果没有进行交换,我们认为剩余都是已经排好序的!直接跳出循环即可!


最后说明下冒泡算法是所有排序算法中最简单的算法,但却是复杂度最高的算法O(n^2),不过冒泡算法是稳定的,学习算法一定要理解其中思想,而不是死记硬背代码!

posted @ 2012-06-03 01:29  笨瓜一号  阅读(173)  评论(0编辑  收藏  举报