冒泡排序

来源:互联网 发布:标准篮球场数据 编辑:程序博客网 时间:2024/06/05 22:58

原理

两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。

实现

function bubbleSort($array) {    // 不是数组或者空数组,直接返回    if (!is_array($array) || count($array) == 0)        return $array;    $count = count($array);    if ($count <= 0)         return false;    for ($i = 0; $i < $count; $i++) {         for ($j = $count - 1; $j > $i; $j--) {             if ($array[$j] < $array[$j - 1]) {                $tmp = $array[$j];                $array[$j] = $array[$j - 1];                $array[$j - 1] = $tmp;            }        }    }    return $array;}

优化

试想一下,如果我们待排序的序列是{2,1,3,4,5,6,7,8,9},也就是说,除了第一和第二的关键字需要交换外,别的都已经是正常的顺序。当i=1时,交换了2和1,此时序列已经有序,不需要再继续后面的循环判断工作了。为了实现这个想法,我们需要改进一下代码,增加一个标记变量flag来实现这一算法的改进。

改进后的代码:

function bubbleSort($array) {    // 不是数组或者空数组,直接返回    if (!is_array($array) || count($array) == 0)        return $array;    $count = count($array);    // 设置标志位来判断数组是否已经有序    $flag = false;    if ($count <= 0)         return false;    for ($i = 0; $i < $count; $i++) {         for ($j = $count - 1; $j > $i; $j--) {             if ($array[$j] < $array[$j - 1]) {                $tmp = $array[$j];                $array[$j] = $array[$j - 1];                $array[$j - 1] = $tmp;                // 如果发生了交换,将flag设置为true,需要进行下一次循环继续判断数组是否需要交换                $flag = true;            }        }        // 如果为正序排列,则直接返回该数组        if (!$flag)             break;        // 重新置为false,继续判断数组是否有序        $flag = false;    }    return $array;}

时间、空间复杂度

当最好的情况,也就是要排序的表本身就是有序的,那么我们比较次数,根据最后改进的代码,可以推断出就是n-1次的比较,没有数据交换,时间复杂度为O(n)。当最坏的情况,即待排序表是逆序的情况,此时需要比较sigma(i=2, n, i-1)=1+2+3+…+(n-1)=n(n-1)/2次,并作等数量级的记录移动。因此,总的时间复杂度为O(n²)。

0 0
原创粉丝点击