什么是冒泡排序?
2022/4/30 23:12:52
本文主要是介绍什么是冒泡排序?,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
什么是冒泡排序?
冒泡排序的思想:把相邻的元素两两比较,当一个元素大于右侧相邻元素时,交换他们的位置;当一个元素小于右侧相邻元素时,位置不变。
冒泡排序是一种稳定排序,值相等的元素并不会打算原本的顺序,由于改排序算法的每一轮都要遍历所有元素,总共遍历(元素数量-1)轮,所以时间复杂度为n的平方阶 冒泡排序的优化 1) 如果能判断出数列已经有序,并做出了标记,那么剩下的几轮排序就不必执行了,可以提前结束工作这只是冒泡排序优化的第一步,我们还可以进一步来提升它的性能。 问题的关键点在于对数列有序区的界定,PHP实现代码如下:
1 <?php 2 3 class Sort 4 { 5 /** 6 * 冒泡排序的第一种写法 7 * @param array $arr 8 * @return array 9 */ 10 public function bubbleSort1(array $arr): array 11 { 12 $length = count($arr); 13 for ($i = 0; $i < $length - 1; $i++) { 14 for ($j = 0; $j < $length - $i - 1; $j++) { 15 if ($arr[$j] > $arr[$j + 1]) { 16 $temp = $arr[$j]; 17 $arr[$j] = $arr[$j + 1]; 18 $arr[$j + 1] = $temp; 19 } 20 } 21 } 22 return $arr; 23 } 24 25 26 /** 27 * 冒泡排序的第二种写法 28 * @param array $arr 29 * @return array 30 */ 31 public function bubbleSort2(array $arr): array 32 { 33 $length = count($arr); 34 35 for ($i = 0; $i < $length - 1; $i++) { 36 // 是否排序标识:如果没有交换,则列表已经完成排序 37 $isSorted = false; 38 for ($j = 0; $j < $length - $i - 1; $j++) { 39 if ($arr[$j] > $arr[$j + 1]) { 40 $temp = $arr[$j]; 41 $arr[$j] = $arr[$j + 1]; 42 $arr[$j + 1] = $temp; 43 $isSorted = true; 44 } 45 } 46 47 if (!$isSorted) { 48 break; 49 } 50 } 51 return $arr; 52 } 53 54 /** 55 * 冒泡排序的第三种写法 56 * @param array $arr 57 * @return array 58 */ 59 public function bubbleSort3(array $arr): array 60 { 61 $length = count($arr); 62 63 // 记录每一轮最后一次交换的下标 64 $swapOffset = 0; 65 66 for ($i = 0; $i < $length - 1; $i++) { 67 // 是否排序标识:如果没有交换,则列表已经完成排序 68 $isSorted = false; 69 70 // 记录的交换下标之后的元素已经完成排序,不用再次排序 71 $swapOffset = $swapOffset ?: ($length - $i - 1); 72 for ($j = 0; $j < $swapOffset; $j++) { 73 if ($arr[$j] > $arr[$j + 1]) { 74 $temp = $arr[$j]; 75 $arr[$j] = $arr[$j + 1]; 76 $arr[$j + 1] = $temp; 77 78 // 记录每一轮最后一次交换的下标 79 $swapOffset = $j; 80 $isSorted = true; 81 } 82 } 83 84 if (!$isSorted) { 85 break; 86 } 87 88 if (!$swapOffset) { 89 break; 90 } 91 } 92 return $arr; 93 } 94 } 95 96 /** 97 * 分析: 98 * 1)n个元素,则外层两两比较 n-1 次 99 * 2)冒泡排序最重要的一个方面是,对于外循环中的每次迭代,都会有至少一次交换。如果没有交换,则列表已经排序 100 * 时间复杂度:n-1+ n-2+.....+2+1= n *(n-1)/2= O(n2) 101 */ 102 103 $arr = [1, 10, 2, 11, 12]; 104 $sort = new Sort(); 105 //$res = $sort->bubbleSort1($arr); 106 //$res = $sort->bubbleSort2($arr); 107 $res = $sort->bubbleSort3($arr); 108 var_dump($res);
这篇关于什么是冒泡排序?的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-21《鸿蒙HarmonyOS应用开发从入门到精通(第2版)》简介
- 2024-12-21后台管理系统开发教程:新手入门全指南
- 2024-12-21后台开发教程:新手入门及实战指南
- 2024-12-21后台综合解决方案教程:新手入门指南
- 2024-12-21接口模块封装教程:新手必备指南
- 2024-12-21请求动作封装教程:新手必看指南
- 2024-12-21RBAC的权限教程:从入门到实践
- 2024-12-21登录鉴权实战:新手入门教程
- 2024-12-21动态权限实战入门指南
- 2024-12-21功能权限实战:新手入门指南