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

什么是冒泡排序

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

算法核心

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

算法复杂度

  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;
 }
相关推荐
呆呆的小鳄鱼9 分钟前
leetcode:冗余连接 II[并查集检查环][节点入度]
算法·leetcode·职场和发展
墨染点香10 分钟前
LeetCode Hot100【6. Z 字形变换】
java·算法·leetcode
沧澜sincerely11 分钟前
排序【各种题型+对应LeetCode习题练习】
算法·leetcode·排序算法
CQ_071211 分钟前
自学力扣:最长连续序列
数据结构·算法·leetcode
弥彦_27 分钟前
cf1925B&C
数据结构·算法
ldj202033 分钟前
SpringBoot为什么使用new RuntimeException() 来获取调用栈?
java·spring boot·后端
超龄超能程序猿34 分钟前
Spring 应用中 Swagger 2.0 迁移 OpenAPI 3.0 详解:配置、注解与实践
java·spring boot·后端·spring·spring cloud
风象南1 小时前
SpringBoot配置属性热更新的轻量级实现
java·spring boot·后端
洛阳泰山1 小时前
Spring Boot 整合 Nacos 实战教程:服务注册发现与配置中心详解
java·spring boot·后端·nacos
Y4090011 小时前
C语言转Java语言,相同与相异之处
java·c语言·开发语言·笔记