yeah

搜索

计数器

62862

链接

新W3C标准中 AJAX 跨域实现以及隐患

PHP排序算法(冒泡排序)

yeah posted @ Jan 13, 2010 02:32:51 AM in 教程 , 1446 阅读

做PHP很少用到算法,把算法都给忘完了,现在重新学习下。,真丢脸!


冒泡排序:
(1),基本思路
后一个数跟前一个数依次比较,每循环一次就把最大的数排到了数组的最后。
注:当排序过一次后,最大的数(位于数组末尾)无需再参与排序
(2),找出数组中的最大数(复习)

$arr = array(1, 5, 8, 2, 7);
$arrSize = count($arr);

//$i < $arrSize - 1 你要问我这个是什么意思?我真想拿砖拍你,后面用到后一个数跟前一个数比较,如果已经到最后一个了,$i 1是不是越界了?
for($i = 0; $i < $arrSize - 1; $i ) {
    //如果后一个数小于前一个数,则交换
    if($arr[$i 1] < $arr[$i]) {
        $tmp = $arr[$i];
        $arr[$i] = $arr[$i 1];
        $arr[$i 1] = $tmp;
    }
}

(3),算法实现
$arr = array(1, 5, 8, 2, 7);
$arrSize = count($arr);

for($i = $arrSize; $i > 1; $i --) {
    for($j = 0; $j < $i - 1; $j ) {
        if($arr[$j 1] < $arr[$j]) {
            $tmp = $arr[$j];
            $arr[$j] = $arr[$j 1];
            $arr[$j 1] = $tmp;
        }
    }
}

(4), 算法优化
    (3)的算法中,第二层循环经过两次交换后,排序已经完成。但外层还一直循环着,我们要设置一个是否交换元素的变量来停止没必要的循环。
$arr = array(1, 5, 8, 2, 7);
$arrSize = count($arr);

for($i = $arrSize; $i > 1; $i --) {
    $exchg = false;
    for($j = 0; $j < $i - 1; $j ) {
        if($arr[$j 1] < $arr[$j]) {
            $tmp = $arr[$j];
            $arr[$j] = $arr[$j 1];
            $arr[$j 1] = $tmp;
            $exchg = true;
        }
    }
    if(! $exchg)
        break;
}
(5),排序效率
这里的效率为最差效率。如果开始时元素使用相反的顺序排列着,无素个数为n个,则后层循环共n-1次,内层循环根据外层循环不断递减,依次为(n-1),(n-2)......2,1,总和为n(n-1)/2次的比较和交换。运行效率为O(n平方)


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter