当前位置: 首页 > news >正文

冒泡排序以及改进方案

冒泡排序以及改进方案

介绍:

冒泡排序属于一种典型的交换排序(两两比较)。冒泡排序就像是把一杯子里的气泡一个个往上冒一样。它不断比较相邻的元素,如果顺序不对就像水泡一样交换它们的位置,直到整个序列像水泡一样,按照大小顺序排列好。当它发现一轮遍历中没有发生交换,就像是水泡都冒完了一样,就知道排序完成了。

图示:

gif01

冒泡排序性能

算法最好时间最坏时间平均时间额外空间稳定性
冒泡O(n)O(n2)O(n2)1稳定

普通版本的冒泡排序

通过简单的两层遍历,就可以实现了:

for (int i = 0; i < array.length; i++) {for (int j = 0; j < array.length -i -1; j++) {if (array[j] > array[j + 1]) {int temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;}}
}

第一次改进:

当一个数组大小不是很混乱的时候,我们没必要每次都去交换:

例如:2,1,3,4,6 这样的数组,我们在第一次交换的时候就已经排好序了(1,2,3,4,6),我们无需再基于1,2,3,4,6排序,改进如下:

for (int i = 0; i < array.length; i++) {int flag = false; // 是否发生交换for (int j = 0; j < array.length -i -1; j++) {if (array[j] > array[j + 1]) { // 顺序不对,需要交换// 以下三行交换操作int temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;flag = true; // 发生了交换}if(!flag) { // 如果没有发生交换,跳出循环,无需比对后面的break;}}}

第二次改进:

最后一次交换位置将整个数组分为了两部分:之前是未排序部分,之后是已排序部分。如此一来,下一次冒泡排序就只需在未排序部分进行冒泡排序即可。 根据这个思路再进行代码改进:

public class BubbleSort {// 冒泡排序算法实现public static void bubbleSort(int[] array) {if (array == null || array.length < 0) {return;}int sortIndex = array.length - 1; // 初始排序边界为数组末尾int lastChange = 0; // 记录最后一次交换的位置for (int i = 0; i < array.length; i++) {boolean flag = false; // 标记是否发生交换for (int j = 0; j < sortIndex; j++) {if (array[j] > array[j + 1]) {int temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;flag = true;lastChange = j; // 更新最后一次交换的位置}}sortIndex = lastChange; // 更新排序边界if (!flag) { // 若未发生交换,说明数组已排序,结束排序break;}}}public static void main(String[] args) {int[] arr = {64, 34, 25, 12, 22, 11, 90};bubbleSort(arr);System.out.println("排序后的数组:");for (int i : arr) {System.out.print(i + " ");}}
}
http://www.lryc.cn/news/247748.html

相关文章:

  • QTextEdit 是 Qt 框架中的一个类,用于显示和编辑多行文本内容的可编辑部件
  • vue+jsonp编写可导出html的模版,可通过外部改json动态更新页面内容
  • 查看各ip下的连接数
  • Linux—进程状态
  • 万宾科技可燃气体监测仪科技作用全览
  • Python与GPU编程快速入门(三)
  • praseInt 和 逻辑或连用
  • 对属于国家秘密的地理信息的获取、持有、提供、利用情况进行登记并长期保存,实行可追溯管理
  • XAER_RMERR: Fatal error occurred in the transaction branch异常解决
  • Redis面试常见问题
  • 浏览器触发下载Excel文件-Java实现
  • 每日汇评:黄金在上涨趋势恢复之前面临修正性回调的风险
  • 【开源】基于Vue.js的大学计算机课程管理平台的设计和实现
  • c++环形队列
  • 智能客服核心技术——预测会话与答案生成
  • C语言——计算Fibonacci数列
  • 【ASP.NET CORE】.NET 6.0 NET CORE MVC连接SQLSERVER数据库
  • filebeat日志收集工具
  • 一文例说嵌入式 C 程序的内聚和耦合
  • python-爬虫(可直接使用)
  • Moonbeam生态项目分析 — — 去中心化交易所Beamswap
  • 自研Xilinx高性能PCIe多通道DMA控制器
  • 人工智能原理复习--知识表示(二)
  • 【SpringBoot篇】登录校验 — JWT令牌
  • leetcode每日一题34
  • 王者荣耀游戏制作
  • springboot post添加URL添加参数
  • 『 MySQL数据库 』插入查询结果
  • 【笔记】小白学习电路维修
  • linux简述进程