/**
* 排序算法:使一个数列的值按照某个规则进行排序的算法,也可以说是用于确定一个数列中每个值的次序位置的算法。
* 在上述定义中涉及数列中每个成员的值和其对应的次序位置(以下简称次位,次位是一个成员的属性,可以看做次序,权,位置,编号等),
* 将一个数列与其进行排序后的新数列对比,其对应值的次位(或者说对应次位的值,也可以说值与次位的对应关系)会按照排序规则发生变化(除非原数列已经完全符合排序规则),
* 所以说,排序算法的实质也就是对数列成员值与次位的对应关系的调整。
* 按从左到右,从前到后,对应次位首尾。
* 冒泡排序法:默认次位按照排序规则从左到右排列,从首位(或末位)开始依次取得排序后该次位对应的值。
* 快速排序法:将数列第一个单元作为界限,按排序规则将数列剩余成员分为两个数列,每个数列递归重复上述操作(直至剩余成员为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));