冒泡排序:两两比较 更小/更大 的交换位置 然后继续比较
基本思想:
冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。
冒泡排序算法:
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为数组中越大的元素会由于一次次排序后逐渐“沉”到数组的后面,而越小的元素会逐渐“浮”到数组的前面,故名。
冒泡排序算法的运作如下:(从后往前)
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的3.元素应该会是最大的数。
4.针对所有的元素重复以上的步骤,除了最后一个。
5.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
冒泡排序算法改进:
上面的冒泡排序算法是否还可以优化呢?答案是肯定的。试想一下,如果我们待排序的序列是{2,1,3,4,5,6,7,8,9},也就是说,除了第一和第二个关键字需要交换外,别的都已经是正常的顺序了。当 i = 0 时,交换了 2 和 1 ,此时的序列已经是有序的了,但是算法仍然不依不挠地将 i = 2 到 9 以及每个循环中的 j 循环都执行了一遍,尽管并没有交换数据,但是之后的大量比较还是大大地多余了。
当 i = 2 时,我们已经对 9 与 8,8 与 7,·······,3 与 2 做了比较,没有任何数据交换,这就说明此序列已经有序,不需要再继续后面的循判断工作了(后面的工作也是不会发生任何数据交换,再做也是没有意义了)。为了实现这个想法,我们需要改进一下代码,增加一个标记变量 flag 来实现这一算法的改进:
以上是介绍,结合以下代码实践即可。
$arr[$j+1]){ //
// $tmp = $arr[$j];
// $arr[$j] = $arr[$j+1];
// $arr[$j+1] = $tmp;
// }
// }
// }
// print_r($arr);
#实测数据库数据排序(按id排序)
$arr = M('invite')->field('id,name,user_id')->order('id asc')->limit(0,3)->select();
// $this->BubbleSort($arr);
$this->BubbleSort1($arr);
}
//交换方法
function swap(array &$arr,$a,$b){
$temp = $arr[$a];
$arr[$a] = $arr[$b];
$arr[$b] = $temp;
}
//冒泡排序1
function BubbleSort(array &$arr){
//[user_id]这一块儿填写自己要判断冒泡的
//if($arr[$j][user_id] < $arr[$j + 1][user_id]) < 或者 > 决定了递减排序还是递增排序
$length = count($arr);
for($i = 0;$i < $length - 1;$i ++){
//从后往前逐层上浮小的元素
for($j = $length - 2;$j >= $i;$j --){
//两两比较相邻记录
if($arr[$j][user_id] < $arr[$j + 1][user_id]){
$this->swap($arr,$j,$j+1);
}
}
}
dump($arr);die();
}
//冒泡排序2的优化(如果某一次循环的时候没有发生元素的交换,则整个数组已经是有序的了)
function BubbleSort1(array &$arr){
$length = count($arr);
$flag = TRUE;
for($i = 0;($i < $length - 1) && $flag;$i ++){
$flag = FALSE;
for($j = $length - 2;$j >= $i;$j --){
if($arr[$j][user_id] < $arr[$j + 1][user_id]){
$this->swap($arr,$j,$j+1);
$flag = TRUE;
}
}
}
return $arr;
}
}