排序算法之冒泡排序

冒泡排序是非常容易理解和实现,以从小到大排序举例:
 设数组长度为N。
  (1)比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。
  (2)这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。
  (3)N=N-1,如果N不为0就重复前面二步,否则排序完成。

代码实现:

  1.传统的算法:

<?php
function bubbleSort(&$a) {
    $t = count($a);
    for ($i = 0; $i < $t - 1; $i++) {
        for ($j = 0; $j < $t - 1 - $i; $j++) {
            if ($a[$j] > $a[$j + 1]) {
                $temp = $a[$j];
                $a[$j] = $a[$j + 1];
                $a[$j + 1] = $temp;
            }
        }
    }
}
$arr = array(3,4,2,1,6,5);
print_r($arr);
bubbleSort($arr);
echo "<br/>";
print_r($arr);
?>

2.双向冒泡排序算法:

<?php
function bubbleSort(&$a) {
    //双向冒泡排序
    $t = count($a);
    $low = 0;
    $high = $t - 1;
    while ($low < $high) {
        //正向冒泡,大数下沉
        for ($i = $low; $i < $high; $i++) {
            if ($a[$i] > $a[$i + 1]) {
                $temp = $a[$i];
                $a[$i] = $a[$i + 1];
                $a[$i + 1] = $temp;
            }
        }
        $high--;
        //反向冒泡,小数上浮
        for ($i = $high; $i > $low; $i--) {
            if ($a[$i] < $a[$i - 1]) {
                $temp = $a[$i];
                $a[$i] = $a[$i - 1];
                $a[$i - 1] = $temp;
            }
        }
        $low++;
    }
}
$arr = array(3,4,2,1,6,5);
print_r($arr);
bubbleSort($arr);
echo "<br/>";
print_r($arr);
?>

3.二维数据排序算法:

<?php
function bubbleSort(&$a, $key) {
    $t = count($a);
    for ($i = 0; $i < $t - 1; $i++) {
        for ($j = 0; $j < $t - 1 - $i; $j++) {
            if ($a[$j][$key] > $a[$j + 1][$key]) {
                $temp = $a[$j];
                $a[$j] = $a[$j + 1];
                $a[$j + 1] = $temp;
            }
        }
    }
}
$arr = array(array('name' => 'zhangsan',  'score' => 29),
    array('name' => 'lisi',  'score' => 18),
    array('name' => 'wangwu',  'score' => 20),
    array('name' => 'huda',  'score' => 30));
print_r($arr);
bubbleSort($arr, 'score');
echo "<br/>";
print_r($arr);
?>

算法分析
 (1)算法的最好时间复杂度
     若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均达到最小值:
        Cmin=n-1
        Mmin=0。
     冒泡排序最好的时间复杂度为O(n)。
 (2)算法的最坏时间复杂度
     若初始文件是反序的,需要进行n-1趟排序。每趟排序要进行n-i次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:
        Cmax=n(n-1)/2=O(n2)
        Mmax=3n(n-1)/2=O(n2)
      冒泡排序的最坏时间复杂度为O(n2)。
 (3)算法的平均时间复杂度为O(n2)
      虽然冒泡排序不一定要进行n-1趟,但由于它的记录移动次数较多,故平均时间性能比直接插入排序要差得多。
 (4)算法稳定性
     冒泡排序是就地排序,且它是稳定的。

posted @ 2013-09-25 20:11  独孤舞  阅读(212)  评论(0)    收藏  举报