php语言冒泡法,冒泡排序法(php)

/**

* 排序算法:使一个数列的值按照某个规则进行排序的算法,也可以说是用于确定一个数列中每个值的次序位置的算法。

*     在上述定义中涉及数列中每个成员的值和其对应的次序位置(以下简称次位,次位是一个成员的属性,可以看做次序,权,位置,编号等),

* 将一个数列与其进行排序后的新数列对比,其对应值的次位(或者说对应次位的值,也可以说值与次位的对应关系)会按照排序规则发生变化(除非原数列已经完全符合排序规则),

* 所以说,排序算法的实质也就是对数列成员值与次位的对应关系的调整。

* 按从左到右,从前到后,对应次位首尾。

* 冒泡排序法:默认次位按照排序规则从左到右排列,从首位(或末位)开始依次取得排序后该次位对应的值。

* 快速排序法:将数列第一个单元作为界限,按排序规则将数列剩余成员分为两个数列,每个数列递归重复上述操作(直至剩余成员为1或0),将递归的每一层都按照 左侧数列 界线成员 右侧数列 的次序重组为一个数列。

*

*/

/**

* 冒泡排序

* 形象阐述:

就像是深水中的泡泡上浮的过程(假设永远到不了水面,即深度绝对足够泡泡纵向排列次序达到稳定),

大的泡泡总会比小的泡泡上浮速度快,从而最终状态为由下至上泡泡依次变大。

* 过程阐述:

以最下面泡泡为第一位,从第一位泡泡起,与上一个泡泡比较大小,如果大的话就交换位置(否则不交换),

然后用现状态的第二位继续与上一位比较,判断是否交换,依次直到与最上面的泡泡比较后,就确定了最大的泡泡。

然后再从第一位起,向上比较与交换,直到确定第二大的泡泡(此时比较的次数已经减一,无需与最大再比较了)。

重复上述操作,直到所有位都确定时,排序完成。

* 概念阐述:

凡是通过比较,逐个确定排序后每个位置上的值的排序方法,可以称之为冒泡排序法

* 注意点:

冒泡排序可以对数列进行升序或降序排列,由比较条件确定

因为是逐个确定排序后每个位置上的值,所以确定次序又可分为从前到后和从后到前两种,由循环确定。

无论哪种写法,泡泡个数(即数列成员个数或者说数组长度)都是需要知道的。

* 以下给出 php 语言实现的两种实现

*

*/

// 结果是升序,且结果是从后到前依次确定的,先确定的是最大的值

function bubbleSort($numbers){

$len = count($numbers);

for($i = 0; $i 

for($j = 0; $j 

if($numbers[$j] > $numbers[$j + 1]){    //  比较的符号决定了结果的升降序。比较的是相邻两个位

$temp = $numbers[$j];               //  符合交换条件,对两个值进行交换,这里用了三步,在 php 中也有别的方法对两个值进行交换

$numbers[$j] = $numbers[$j + 1];

$numbers[$j + 1] = $temp;

}

}

}

return $numbers;

}

// $num = array(20, 40, 60, 80, 30, 70, 90, 10, 50, 0);

// var_dump(bubbleSort($num));

// 一直以为下面这种也是冒泡排序,其实不是的,不过是个变种,思想不一样

// 结果是升序,且结果是从前到后依次确定的,先确定的是最小的值

function anotherSort($numbers){

$len = count($numbers);

for($i = 0; $i 

for($j = $i + 1; $j 

if($numbers[$i] > $numbers[$j]){        //  比较的符号决定了结果的升降序。比较的是待确定值的位置上的值与所有剩余的自由值。

$temp = $numbers[$i];               //  符合交换条件,对两个值进行交换,这里用了三步,在 php 中也有别的方法对两个值进行交换

$numbers[$i] = $numbers[$j];

$numbers[$j] = $temp;

}

}

}

return $numbers;

}

// $num = array(20, 40, 60, 80, 30, 70, 90, 10, 50, 0);

// var_dump(bubbleSort_1($num));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值