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

什么是冒泡排序

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

算法核心

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

算法复杂度

  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;
 }
相关推荐
luj_176816 小时前
残熵算法实时化三大瓶颈突破
c语言·开发语言·网络·经验分享·算法
我命由我1234516 小时前
Android Studio - Android Studio 自定义预览尺寸
android·java·ide·java-ee·android studio·android-studio·android runtime
mCell17 小时前
你以为短链接只是 Hash + 301/302?
后端·算法·架构
咖啡八杯17 小时前
GoF设计模式——迭代器模式
java·后端·设计模式·迭代器模式
远离UE417 小时前
UE5 compute shader 原子加
开发语言·c++·ue5
C+-C资深大佬18 小时前
C++ 显式类型转换详解:static_cast、dynamic_cast、const_cast、reinterpret_cast
开发语言·c++
AIGS00118 小时前
企业AI落地的关键认知:向量空间JBoltAI的本体语义平台
java·人工智能·人工智能ai大模型应用
码少女18 小时前
数据结构——哈希表的基础
数据结构·散列表
KaMeidebaby18 小时前
卡梅德生物技术快报|抗体亲和力成熟工业化调控新机制:差异性浆细胞增殖工艺优化思路
java·开发语言·人工智能·算法·机器学习·架构·spark
luj_176819 小时前
心形曲线轨迹控制三大关键技术
c语言·开发语言·c++·经验分享·算法