YII Blog
Yeah Cheung 's Yeah Cheung
yeah
热门文章
搜索
计数器
最新留言
链接
最新评论
PHP排序算法(冒泡排序)
做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平方)