排序算法之冒泡排序
冒泡排序是非常容易理解和实现,以从小到大排序举例:
设数组长度为N。
(1)比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。
(2)这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。
(3)N=N-1,如果N不为0就重复前面二步,否则排序完成。
代码实现:
1.传统的算法:
<?php
function bubbleSort(&$a) {
$t = count($a);
for ($i = 0; $i < $t - 1; $i++) {
for ($j = 0; $j < $t - 1 - $i; $j++) {
if ($a[$j] > $a[$j + 1]) {
$temp = $a[$j];
$a[$j] = $a[$j + 1];
$a[$j + 1] = $temp;
}
}
}
}
$arr = array(3,4,2,1,6,5);
print_r($arr);
bubbleSort($arr);
echo "<br/>";
print_r($arr);
?>
2.双向冒泡排序算法:
<?php
function bubbleSort(&$a) {
//双向冒泡排序
$t = count($a);
$low = 0;
$high = $t - 1;
while ($low < $high) {
//正向冒泡,大数下沉
for ($i = $low; $i < $high; $i++) {
if ($a[$i] > $a[$i + 1]) {
$temp = $a[$i];
$a[$i] = $a[$i + 1];
$a[$i + 1] = $temp;
}
}
$high--;
//反向冒泡,小数上浮
for ($i = $high; $i > $low; $i--) {
if ($a[$i] < $a[$i - 1]) {
$temp = $a[$i];
$a[$i] = $a[$i - 1];
$a[$i - 1] = $temp;
}
}
$low++;
}
}
$arr = array(3,4,2,1,6,5);
print_r($arr);
bubbleSort($arr);
echo "<br/>";
print_r($arr);
?>
3.二维数据排序算法:
<?php
function bubbleSort(&$a, $key) {
$t = count($a);
for ($i = 0; $i < $t - 1; $i++) {
for ($j = 0; $j < $t - 1 - $i; $j++) {
if ($a[$j][$key] > $a[$j + 1][$key]) {
$temp = $a[$j];
$a[$j] = $a[$j + 1];
$a[$j + 1] = $temp;
}
}
}
}
$arr = array(array('name' => 'zhangsan', 'score' => 29),
array('name' => 'lisi', 'score' => 18),
array('name' => 'wangwu', 'score' => 20),
array('name' => 'huda', 'score' => 30));
print_r($arr);
bubbleSort($arr, 'score');
echo "<br/>";
print_r($arr);
?>
算法分析
(1)算法的最好时间复杂度
若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均达到最小值:
Cmin=n-1
Mmin=0。
冒泡排序最好的时间复杂度为O(n)。
(2)算法的最坏时间复杂度
若初始文件是反序的,需要进行n-1趟排序。每趟排序要进行n-i次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:
Cmax=n(n-1)/2=O(n2)
Mmax=3n(n-1)/2=O(n2)
冒泡排序的最坏时间复杂度为O(n2)。
(3)算法的平均时间复杂度为O(n2)
虽然冒泡排序不一定要进行n-1趟,但由于它的记录移动次数较多,故平均时间性能比直接插入排序要差得多。
(4)算法稳定性
冒泡排序是就地排序,且它是稳定的。

浙公网安备 33010602011771号