冒泡排序是一种交换排序。

什么是交换排序呢?

交换排序:两两比较待排序的关键字,并交换不满足次序要求的那对数,直到整个表都满足次序要求为止。

一、算法基本思想

(1)基本思想

冒泡排序的基本思想就是:从无序序列头部开始,进行两两比较,根据大小交换位置,直到最后将最大(小)的数据元素交换到了无序队列的队尾,从而成为有序序列的一部分;下一次继续这个过程,直到所有数据元素都排好序。

算法的核心在于每次通过两两比较交换位置,选出剩余无序序列里最大(小)的数据元素放到队尾

2)运行过程

冒泡排序算法的运作如下:

1、比较相邻的元素。如果第一个比第二个大(小),就交换他们两个。

2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大(小)的数。

3、针对所有的元素重复以上的步骤,除了最后已经选出的元素(有序)。

4、持续每次对越来越少的元素(无序元素)重复上面的步骤,直到没有任何一对数字需要比较,则序列最终有序。

实现:

public class bubbleSort {public static void main(String[] args) {int [] a = {3,6,4,2,10,11,10,5};int temp = 0; // 用来交换的临时数for(int i=0;i<a.length;i++){           //i--[0,a.length]:要遍历的次数//内部循环:依次比较两个相邻位置,然后把最大的找出来放在队尾,下一次循环终止位置对应-1for(int j = 0;j<a.length-1-i;j++){if(a[j]>a[j+1]){temp = a[j];a[j] = a[j+1];a[j+1] = temp;}}}for(int i=0;i<a.length;i++)System.out.print(a[i]+" ");}
}

时间复杂度

若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数 C 和记录移动次数 M 均达到最小值:Cmin = N - 1, Mmin = 0。所以,冒泡排序最好时间复杂度为 O(N)。

若初始文件是反序的,需要进行 N -1 趟排序。每趟排序要进行 N - i 次关键字的比较(1 ≤ i ≤ N - 1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:

Cmax = N(N-1)/2 = O(N2)
Mmax = 3N(N-1)/2 = O(N2)

冒泡排序的最坏时间复杂度为 O(N2)。因此,冒泡排序的平均时间复杂度为 O(N2)。

总结起来,其实就是一句话:当数据越接近正序时,冒泡排序性能越好。

算法稳定性

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。

所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

优化

对冒泡排序常见的改进方法是加入标志性变量 exchange,用于标志某一趟排序过程中是否有数据交换。

如果进行某一趟排序时并没有进行数据交换,则说明所有数据已经有序,可立即结束排序,避免不必要的比较过程。

public class bubbleSort {public static void main(String[] args) {int [] a = {3,6,4,2,10,11,10,5};int temp = 0; // 用来交换的临时数boolean bChange = false; // 交换标志//i--[0,a.length]:要遍历的次数for(int i=0;i<a.length;i++){//新循环之前都把标志位改为false,希望本次没有交换bChange = false;//内部循环:依次比较两个相邻位置,然后把最大的找出来放在队尾,下一次循环终止位置对应-1for(int j = 0;j<a.length-1-i;j++){if(a[j]>a[j+1]){temp = a[j];a[j] = a[j+1];a[j+1] = temp;bChange = true;}}// 如果标志为false,说明本轮遍历没有交换,已经是有序数列,可以结束排序if (false == bChange)break;}for(int i=0;i<a.length;i++)System.out.print(a[i]+" ");}
}

借鉴:https://mp.weixin.qq.com/s/WCLI61gvdqPRjOkBuXvuUg、https://blog.csdn.net/guoweimelon/article/details/50902597

经典排序算法(1)——冒泡排序算法详解相关推荐

  1. kmeans python interation flag_机器学习经典算法-logistic回归代码详解

    一.算法简要 我们希望有这么一种函数:接受输入然后预测出类别,这样用于分类.这里,用到了数学中的sigmoid函数,sigmoid函数的具体表达式和函数图象如下: 可以较为清楚的看到,当输入的x小于0 ...

  2. 天津理工大学《操作系统》实验二,存储器的分配与回收算法实现,代码详解,保姆式注释讲解

    天津理工大学<操作系统>实验二,存储器的分配与回收算法实现,代码详解,保姆式注释讲解 实验内容 1. 本实验是模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不 ...

  3. 操作系统:基于页面置换算法的缓存原理详解(下)

    概述: 在上一篇<操作系统:基于页面置换算法的缓存原理详解(上)>中,我们主要阐述了FIFO.LRU和Clock页面置换算法.接着上一篇说到的,本文也有三个核心算法要讲解.分别是LFU(L ...

  4. python实验原理_Python实现蒙特卡洛算法小实验过程详解

    蒙特卡洛算法思想 蒙特卡洛(Monte Carlo)法是一类随机算法的统称,提出者是大名鼎鼎的数学家冯·诺伊曼,他在20世纪40年代中期用驰名世界的赌城-摩纳哥的蒙特卡洛来命名这种方法. 通俗的解释一 ...

  5. 图解机器学习算法(6) | 决策树模型详解(机器学习通关指南·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/34 本文地址:https://www.showmeai.tech/article-d ...

  6. Matlab中的FCM算法代码及中文详解

    Matlab中的FCM算法代码及中文详解 转自:http://xiaozu.renren.com/xiaozu/106512/336681453 function [center, U, obj_fc ...

  7. KMP算法之next数组详解

    KMP算法之next数组详解 KMP算法实现原理 KMP算法是一种非常高效的字符串匹配算法,下面我们来讲解一下KMP算如何高效的实现字符串匹配.我们假设如下主串和模式串: int i;//i表示主串的 ...

  8. SMART S7-200PLC流量累计算法实现(梯形图算法详解+优化)

    流量累计基于积分的原理,采用细分面积的方法近似计算瞬时流量的累加.离散上也就是累加求和.公式虽然简单但是流量累计仍有些需要注意的地方,下面一一和大家举例说明. 1.数值积分的通式 2.梯形积分公式 从 ...

  9. matlab中存档算法代码,Matlab中的FCM算法代码及中文详解

    Matlab中的FCM算法代码及中文详解 转自:http://xiaozu.renren.com/xiaozu/106512/336681453 function [center, U, obj_fc ...

  10. Java冒泡排序(详解)

    Java中冒泡排序(详解) 冒泡排序 冒泡排序(默认升序),就是通过双重循环,相邻位置的元素相比较,如若前一个数字大于后一个数字,则向后移动一位,知道完成第一轮排序,最后一位数字即为所需排序数字中的最 ...

最新文章

  1. vmwear导出OVF模板解析(解决ovf导入服务器失败问题,虚拟机版本等)
  2. ERROR MESSAGE: Invalid command line: Malformed walker argument: Could not find walker with name
  3. python【蓝桥杯vip练习题库】ALGO-145 4-1打印下述图形
  4. 有兴趣吗?程序员分手手册,教你如何恢复单身
  5. linux sed 空间模式,整理:SED的模式空间与缓冲区及n,N,d,D,p,P,h,H,g,G,x解析...
  6. mysql id生成器自定义_MybatisPlus使用自定义Id生成器数据自动填充
  7. mysql innodb redolog_Mysql的binlog 和InnoDB的redo-log
  8. leetcode - Interleaving String
  9. python战斗2:看到一个页面编码
  10. 必知必会SQL(贰) --索引(聚集[簇]索引和非聚[簇]集索引) vs 全文本索引
  11. mysql优化了解_了解MySQL如何优化
  12. eclipse错误及解决方法
  13. ImageLoader的简单分析
  14. 线性代数可以速成吗_怎样速成线性代数?
  15. VLIW Microprocessor Hardware Design
  16. 服务器编程之路:进无止境(下)
  17. 在网页上使用苹方字体
  18. 全球与中国一体化VR摄影机市场现状及未来发展趋势2022-2028
  19. PCB 布局布线小技巧
  20. ringbuff | 通用FIFO环形缓冲区实现库

热门文章

  1. Deepin 微信经常出现假死问题解决办法。
  2. win10计算器rsh_Win10系统有哪些计算器快捷键?快捷键的介绍
  3. 爬虫Scrapy框架学习(三)-爬取苏宁图书信息案例
  4. 图片隐写 安恒ctf_图片隐写 安恒ctf_CTF中图片隐写的一些整理总结
  5. 什么是Equal Error Rate (EER)
  6. harry-通过刺激战场来学习python的字典用法
  7. java获取天气预报_使用java获取未来7天天气信息,可用于android
  8. 基于多智能体深度强化学习的空地协同通信系统轨迹设计与访问控制
  9. Android 5.0 以上开机音乐实现
  10. 张高兴的 Xamarin.Forms 开发笔记:为 Android 与 iOS 引入 UWP 风格的汉堡菜单 ( MasterDetailPage )...