冒泡排序
来源:互联网 发布:标准篮球场数据 编辑:程序博客网 时间:2024/06/05 22:58
原理
两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。
实现
function bubbleSort($array) { // 不是数组或者空数组,直接返回 if (!is_array($array) || count($array) == 0) return $array; $count = count($array); if ($count <= 0) return false; for ($i = 0; $i < $count; $i++) { for ($j = $count - 1; $j > $i; $j--) { if ($array[$j] < $array[$j - 1]) { $tmp = $array[$j]; $array[$j] = $array[$j - 1]; $array[$j - 1] = $tmp; } } } return $array;}
优化
试想一下,如果我们待排序的序列是{2,1,3,4,5,6,7,8,9},也就是说,除了第一和第二的关键字需要交换外,别的都已经是正常的顺序。当i=1时,交换了2和1,此时序列已经有序,不需要再继续后面的循环判断工作了。为了实现这个想法,我们需要改进一下代码,增加一个标记变量flag来实现这一算法的改进。
改进后的代码:
function bubbleSort($array) { // 不是数组或者空数组,直接返回 if (!is_array($array) || count($array) == 0) return $array; $count = count($array); // 设置标志位来判断数组是否已经有序 $flag = false; if ($count <= 0) return false; for ($i = 0; $i < $count; $i++) { for ($j = $count - 1; $j > $i; $j--) { if ($array[$j] < $array[$j - 1]) { $tmp = $array[$j]; $array[$j] = $array[$j - 1]; $array[$j - 1] = $tmp; // 如果发生了交换,将flag设置为true,需要进行下一次循环继续判断数组是否需要交换 $flag = true; } } // 如果为正序排列,则直接返回该数组 if (!$flag) break; // 重新置为false,继续判断数组是否有序 $flag = false; } return $array;}
时间、空间复杂度
当最好的情况,也就是要排序的表本身就是有序的,那么我们比较次数,根据最后改进的代码,可以推断出就是n-1次的比较,没有数据交换,时间复杂度为O(n)。当最坏的情况,即待排序表是逆序的情况,此时需要比较sigma(i=2, n, i-1)=1+2+3+…+(n-1)=n(n-1)/2次,并作等数量级的记录移动。因此,总的时间复杂度为O(n²)。
0 0
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 微服务,微架构[四]之springboot集成Redis缓存
- Yeoman自动构建js项目
- 基于Java I/O的应用程序实验
- html中offsetTop、clientTop、scrollTop、offsetTop各属性介绍
- Java多线程随笔
- 冒泡排序
- Sum—LeetCode-560 Subarray Sum Equals K
- 一行代码搞定漂亮的Android6.0权限申请界面
- reduce函数
- 支付宝退款功能开发
- reactjs1环境搭建
- 简单Profibus/DP实验系统的组建
- 最新yoco v2训练自己的数据
- Oracle 12C 新特性之扩展数据类型(extended data type)