冒泡排序算法

原理:循环数组,每次固定最后一位最值

function bubble_sort($array) {
	$length = count($array);
	for ($i=$length-1; $i>=0; $i--) {
		for ($j=0; $j<$i; $j++) {
			if ( $array[$j] > $array[$j+1] ) {
				$temp = $array[$j];
				$array[$j] = $array[$j+1];
				$array[$j+1] = $temp;
			}
		}
		echo '循环后固定在队尾的最大值-->'.$array[$i].'<br>';
	}
	return $array;
}
$cc = bubble_sort(array(3,2,1,4));
echo '<pre>';
print_r($cc);
//输出
循环后固定在队尾的最大值-->4
循环后固定在队尾的最大值-->3
循环后固定在队尾的最大值-->2
循环后固定在队尾的最大值-->1
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)


--- 冒泡排序算法的改进
1. 设置一标志位变量pos,用于记录每趟排序最后一次交换的位置。由于pos位置之后的记录均已交换到位,故在进行下一趟排序时只需要扫描到pos位置即可
function bubble_1($arr) {
	$i = count($arr)-1;
	while ( $i > 0 ) {
		$pos = 0; //每趟开始时,无记录交换
		for ($j=0; $j<$i; $j++) {
			if ( $arr[$j] > $arr[$j+1] ) {
				/* $temp = $arr[$j];
				$arr[$j+1] = $arr[$j];
				$arr[$j] = $temp; */
				list($arr[$j], $arr[$j+1]) = array($arr[$j+1], $arr[$j]);
				$pos = $j; //记录交换的位置
			}
		}
		$i = $pos; //为下一趟排序作准备
	}
	return $arr;
}
$cc = bubble_1(array(3,2,1,4));

2.传统冒泡排序中每趟排序操作只能找到一个最值,我们考虑在每趟排序中进行正向和反向两次冒泡找到最大值和最小值,从而使排序趟数几乎减少了一半。
function bubble_2($arr) {
	$low = 0;	
	$high = count($arr) - 1;
	while ( $low < $high) {
		for ($i=$low; $i<$high; $i++) { //正向冒泡,找到最大者
			if ( $arr[$i] > $arr[$i+1] ) {
				list($arr[$i], $arr[$i+1]) = array($arr[$i+1], $arr[$i]);
			}
		}
		$high--; //修改high值, 前移一位
		for ($i=$high; $i>$low; $i--) { //反向冒泡,找到最小者
			if ( $arr[$i] < $arr[$i-1] ) {
				list($arr[$i-1], $arr[$i]) = array($arr[$i], $arr[$i-1]);
			}
		}
		$low++; //修改low值,后移一位
	}
	return $arr;
}
$cc = bubble_2(array(3,2,7,6,1,4,8));




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值