数据结构算法-排序(一)-冒泡排序

什么是冒泡排序

冒泡排序:在原数组中通过相邻两项元素的比较,交换而完成的排序算法。

算法核心

数组中相邻两项比较、交换。

算法复杂度

  1. 时间复杂度
    实现一次排序找到最大值需要遍历 n-1次(n为数组长度)
    需要这样的排序 n-1次。 需要 (n-1) * (n-1) ---> O(n^2)
    时间复杂度: O(n^2)

算法实现原理

我们以一次排序为例,了解冒泡排序是如何完成排序过程的。

相邻两项比较交换:

  1. 23 和 7 比较, 23和7 交换位置(23>7大泡泡上升)
  2. 23 和 33 比较, 位置不变。
  3. 33 和15 比较, 33 和15交换位置。
  4. 33 和 34 比较, 位置不变。
  5. 34 和 12 比较, 34和12交换位置。
  6. 第一轮排序结束: 34 作为最大的泡泡上升的数组的lenght-1位置。

参考实现

java 复制代码
 for(int i =0; i < a.length; i++){
   for(int j =0; j < a.length - i-1; j++){
      if(a[j] > [j+1] ){
		int tmp = a[j];
		a[j] = a[j+1];
		a[j+1] = tmp;
    }
   }
 }

扩展问题

对于已经有序的数组,例如a[] = {1,2,3,4,5,6,7}, 那么冒泡排序还需要进行大量的比较,这样效率并不高。

解决方案\] 我们可以做一个标记flag = true, 如果进入比较条件则改变flag的值,如果一轮循环之后,发现flag没有变化,那么说明数组是有序的,则不需要继续遍历了。

java 复制代码
 for(int i =0; i < a.length; i++){
   boolean flag = true;
   for(int j =0; j < a.length - i-1; j++){
      if(a[j] > [j+1] ){
      	flag = false;
		int tmp = a[j];
		a[j] = a[j+1];
		a[j+1] = tmp;
    }
   }
   if(flag) break;
 }
相关推荐
_OP_CHEN13 小时前
【从零开始的Qt开发指南】(二十二)Qt 音视频开发宝典:从音频播放到视频播放器的实战全攻略
开发语言·c++·qt·音视频·前端开发·客户端开发·gui开发
oioihoii13 小时前
从C++到C#的转型完全指南
开发语言·c++·c#
区区一散修14 小时前
Java进阶 6. 集合
java·开发语言
Ka1Yan14 小时前
[链表] - 代码随想录 160. 相交链表
算法·leetcode·链表
Ka1Yan14 小时前
[链表] - 代码随想录 206. 反转链表
数据结构·链表
学嵌入式的小杨同学14 小时前
C 语言实战:动态规划求解最长公共子串(连续),附完整实现与优化
数据结构·c++·算法·unity·游戏引擎·代理模式
阿里-于怀14 小时前
AgentScope AutoContextMemory:告别 Agent 上下文焦虑
android·java·数据库·agentscope
OpenTiny社区14 小时前
TinyPro v1.4.0 正式发布:支持 Spring Boot、移动端适配、新增卡片列表和高级表单页面
java·前端·spring boot·后端·开源·opentiny
lonelyhiker14 小时前
IDEA未编译完就启动项目的问题
java·ide·intellij-idea
rgeshfgreh14 小时前
顺序表实战:构建到销毁全解析
算法