冒泡排序的思路是这样的:从头到尾扫描待排序列,如果当前元素大于下一个元素,则两元素交换位置,每经过一次扫描最大元素移到待排序列最后。

static public function bubbleSort(&$arr){
    if(!is_array($arr)){
        return false;
    }
    $len = count($arr);
    // 每扫描一次,筛出最大的元素放到最后
    for($i=0;$i<$len;$i++){
        $end = $len - $i;
        $flag = false;
        for($j=1;$j<$end;$j++){
            if($arr[$j-1]>$arr[$j]){
                self::_swap($arr,$j-1,$j);
                $flag = true;
            }
        }
        if(!$flag){
            break;
        }
    }
    return true;
}

上面的实现中有个$flag,它的作用是表示是否已经排好序了,当还需要交换的时候说明没有排好序,一次扫描没有发生交换说明已经排好序了,这时候需要终止循环避免无用的扫描。

这个实现对应最好时间复杂度为O(n),对应最坏时间复杂度为O(n^2)。

results matching ""

    No results matching ""