原理:对一组数据,比较相邻数据的大小,将值小数据在前面,值大的数据放在后面。 (以下都是升序排列,即从小到大排列)
举例说明: $arr = array(6, 3, 8, 2, 9, 1);
$arr 有6个数据,按照两两比较大小如下,注意 比较轮数 和 每轮比较次数
第一轮排序:
第一次比较 6和3比较 结果:3 6 8 2 9 1
第二次比较 6和3比较 结果:3 6 8 2 9 1
第三次比较 8和2比较 结果:3 6 2 8 9 1
第四次比较 8和9比较 结果:3 6 2 8 9 1
第五次比较 9和1比较 结果:3 6 2 8 1 9
第一轮比较总结:1.排序第1轮、比较5次,没有获得从小到大的排序 2.因为每次比较都是大数往后靠,所以比较完成后,可以确定大数排在最后(9 已经冒泡冒出来了,下轮比较可以不用比较了 )
第二轮排序:
第一次比较 3和6比较 结果:3 6 2 8 1 9
第二次比较 6和2比较 结果:3 2 6 8 1 9
第三次比较 6和8比较 结果:3 2 6 8 1 9
第四次比较 8和1比较 结果:3 2 6 1 8 9
第二轮比较总结:1.排序第2轮、比较4次,没有获得从小到大的排序 2.冒泡出了 8,下轮不用比较8 了
第三轮排序:
第一次比较 3和2比较 结果:2 3 6 1 8 9
第二次比较 3和6比较 结果:2 3 6 1 8 9
第三次比较 6和1比较 结果:2 3 1 6 8 9
第三轮比较总结:1.排序第3轮、比较3次,没有获得从小到大的排序 2.冒泡出了 6,下轮不用比较6 了
第四轮排序:
第一次比较 2和3比较 结果:2 3 1 6 8 9
第二次比较 3和1比较 结果:2 1 3 6 8 9
第四轮比较总结:1.排序第4轮、比较2次,没有获得从小到大的排序 2.冒泡出了 3,下轮不用比较3 了
第五轮排序:
第一次比较 2和1比较 结果:1 2 3 6 8 9
第五轮比较总结:1.排序第5轮、比较1次,没有获得从小到大的排序 2.冒泡出了 2,由于还剩一个1,不用再比较了,至此通过5轮排序,完成整个排序。
通过以上五轮排序,若干次比较,我们有理由推断出一个结论:
对于一个长度为N的数组,我们需要排序 N-1 轮,每 i 轮 要比较 N-i 次。对此我们可以用双重循环语句,外层循环控制循环轮次,内层循环控制每轮的比较次数。
python版本
# *_*coding:utf-8 *_* #对于一个长度为N的数组,我们需要排序 N-1 轮,每 i 轮 要比较 N-i 次。对此我们可以用双重循环语句,外层循环控制循环轮次,内层循环控制每轮的比较次数 def bubble_sort(sort_list,sort='asc'): if len(sort_list) <= 0: return [] count = len(sort_list) sorted_list = sort_list for i in range(0,count-1): print('第%d趟排序:' % (i + 1)) for j in range(0,count-i-1): if sorted_list[j] > sorted_list[j + 1] : sorted_list[j], sorted_list[j + 1] = sorted_list[j + 1], sorted_list[j] print(sorted_list) list = [3,4,2,6,5,9] bubble_sort(list)
php版本
<?php
/**
* Created by PhpStorm.
* User: mac
* Date: 2018/10/9
* Time: 22:39
*/
/**
* @author brady
* @desc 冒泡排序
* @param $arr 待排序的数组
* @param string $sort 排序方式 asc 升序 desc降序
* @time 2018/10/9
* 一共要外层循环n-1次 内层循环每次外层循环一次 最后一个会不需要排序 n-i-1次
*/
function bubble_sort($arr,$sort='asc')
{
$count = count($arr);
for($i = 0; $i < $count-1; $i++){
for($j = 0; $j< $count - 1 - $i; $j++){
$tmp = '';
if($sort == 'asc'){
if($arr[$j] > $arr[$j+1]){
$tmp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $tmp;
}
} else {
if($arr[$j] < $arr[$j+1]){
$tmp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $tmp;
}
}
echo "第".($i+1)."轮循环 后数组排序为:".json_encode($arr)."<br>";
}
echo "<hr>";
}
return $arr;
}
/**
* @author brady
* @desc 冒泡排序
* @param $arr 待排序的数组
* @param string $sort 排序方式 asc 升序 desc降序
* @time 2018/10/9
* 从最后一个进行冒泡 把最大的冒泡到最左边 第一次 冒泡后 第二次 最左边的一个已经合格 内层循环少一次 所以为 只循环 $j>$i
*/
function bubble_sort2($arr,$sort='asc')
{
$count = count($arr);
for($i = 0; $i < $count-1; $i++){
for($j = $count - 1; $j> $i ; $j--){
$tmp = '';
if($sort == 'desc'){
if($arr[$j] > $arr[$j-1]){
$tmp = $arr[$j];
$arr[$j] = $arr[$j-1];
$arr[$j-1] = $tmp;
}
} else {
if($arr[$j] < $arr[$j-1]){
$tmp = $arr[$j];
$arr[$j] = $arr[$j-1];
$arr[$j-1] = $tmp;
}
}
echo "第".($i+1)."轮循环 后数组排序为:".json_encode($arr)."<br>";
}
echo "<hr>";
}
return $arr;
}
$arr = [9,6,3,7,5,4];
$res = bubble_sort2($arr,'asc');
echo "<pre>";
print_r($res);
echo "</pre>";
$b=[1,2,3,7,5,4];
$len=count($b);//6
for($k=1;$k<$len;$k++)
{
for($j=0;$j<$len-$k;$j++){
if($b[$j]>$b[$j+1]){
$temp =$b[$j+1];
$b[$j+1] =$b[$j] ;
$b[$j] = $temp;
}
echo "第".($k)."轮循环 后数组排序为:".json_encode($b)."<br>";
}
echo "<hr>";
}
print_r($b);