冒泡排序Java实现以及时间复杂度分析

Java实现

public class BubboSort_01 {public static void main(String[] args) {int[] num={3,1,5,2,5,6,12,8,9};BubboSort(num);System.out.println(Arrays.toString(num));}public static void BubboSort(int[] arr){int lastExchangeIndex=0;            //上次交换的最后的位置int sortBorder= arr.length-1;       //有序边界for (int i=0;i<arr.length-1;i++){boolean isSorted=true;          //标记是否已经有序for (int j=0;j<sortBorder;j++){if(arr[j+1]<arr[j]){int temp=arr[j+1];arr[j+1]=arr[j];arr[j]=temp;lastExchangeIndex=j;isSorted=false;}}sortBorder=lastExchangeIndex;if(isSorted){break;}}}}

从代码中分析几个问题
冒泡排序是原地排序算法吗?
冒泡排序的过程只涉及相邻数据的交换操作,只需要常量级的临时空间,因此,空间复杂度为O(1),是一个原地排序算法。

冒泡排序是稳定排序算法吗?
在冒泡排序中,只有交换才可以改变两个元素的前后顺序。为了保证冒泡排序的稳定性,在冒泡的过程中,我们对两个大小相等的相邻的元素不做交换,这样就能保证相同大小的元素,在排序前后原有的先后顺序不会改变,因此,冒泡排序是稳定排序。

时间复杂度分析

在最好的情况下,待排序的序列已经有顺序的了,所以只需要比较一次就可以,这个时候的时间复杂度为O(1);在最坏的情况下,待排序的序列恰好是倒序的,这个时候需要进行n次冒泡,而每次冒泡需要比较n个元素(这个随者已排好序列的增加而减少,但一般都看作是n个元素),所以时间复杂度为O(n^2)。
重点来了,平均时间复杂度是多少呢?
这里使用一种简单,不是非常严谨的方法来计算。
首先需要明白什么是有序度,什么是逆序度
有序度是指数组中具有有序关系的元素对的个数,如果用数字表达式表示出来,就是a[i]<=a[j],i<=j;如下图:

逆序度的定义正好与有序度相反,是指数组中逆序元素对的个数,而逆序元素对的定义也与有序元素对正好相反,即:a[i]<a[j],i>j。
对于一个倒序(假设从小到大为有序)排列的数组,如 [6,5,4,3,2,1],有序度是0,逆序度是n*(n-1)/2,也就是15;对于一个完全有序的数组,如[1,2,3,4,5,6],有序度是n*(n-1)/2,也就是15,逆序度是0。我们把完全有序的数组的有序度称为满有序度(也就是n*(n-1)/2)。满序度,逆序度以及有序度之间有一定的关系:逆序度=满序度-有序度。排序的过程就是增加有序度、减少逆序度的过程。当最终达到满序度的时候,就是有序的了。
假设待排序的数组的初始状态是[4,5,6,3,2,1],其中,有序元素对有(4,6)、(4,5)、(5,6),因此有序度为3,而满有序度则为n*(n-1)/2=15。
冒泡排序过程包含两个操作:比较和交换。因为冒泡排序只会交换相邻的两个元素,所以每进行一次交换操作,有序度就会增加1,因此,无论冒泡排序算法怎样改进,总交换次数是确定的,即为逆序度,也就是n*(n-1)/2减去初始有序度,在上面的序列中,要交换的次数则为15-3=12。

那么,对于包含n个数据的数组进行冒泡排序,平均交换次数是多少呢?

在最坏的情况下,初始状态的有序度是0,因此要进行n*(n-1)/2次交换。在最好的情况下,无须交换。那么我们就可以去中间值n*(n-1)/4,用它表示初始有序度既不是很高,也不是很低的平均情况。换句话说,在平均情况下,需要n*(n-1)/4次交换操作,也就是说,交换操作次数n^2量级的。而比较操作肯定要比交换操作多,复杂度的上限又是O(n ^ 2),因此,比较操作次数也是n ^ 2量级的。综合比较和交换两部分操作,冒泡排序平均情况下的时间复杂度为O(n^2)。

冒泡排序Java实现以及时间复杂度分析相关推荐

  1. 冒泡排序java代码_数据结构与算法—冒泡排序(Java实现)

    [toc] 冒泡排序 程序代码 package com.uplooking.bigdata.datastructure; import java.util.Arrays; public class B ...

  2. 冒泡排序java代码_面试官问我插入排序和冒泡排序哪个更牛逼?

    (给算法爱好者加星标,修炼编程内功) 来源:小鹿动画学编程,作者:小鹿同学 写在前边 排序对于每个开发者来讲,都多多少少知道几个经典的排序算法,比如我们之前以动画形式分享的冒泡排序,也包括今天要分享的 ...

  3. 递归函数时间复杂度分析

    递归函数时间复杂度分析 (1) 递归执行过程     例子:求N!.      这是一个简单的"累乘"问题,用递归算法也能解决.      n! = n * (n - 1)!    ...

  4. java动态数组的实现的_基于Java的动态数组分析与实现

    动态数组 概念 基于Java提供的静态数组封装自己的动态数组,动态数组涉及的组成部分如下图所示. 组成部分解读data:静态数组,通过泛型支持多种类型的元素:private E[] data;. si ...

  5. 排序算法 之希尔排序及时间复杂度分析

    排序算法之 冒泡排序及性能优化(时间复杂度+空间复杂度分析) 排序算法之 简单选择排序及时间复杂度分析 排序算法之 直接插入排序及时间复杂度分析 希尔排序 算法思想:将整个待排序列分割成若干个子序列( ...

  6. python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图

    python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...

  7. java难点_JAVA-详细分析JAVA中的难点与重点

    Java中有很多内容在开发项目的过程中并不常用,但是却是很重要的部分,为了避免忘记,今天重新温习了一遍Java中的重点和难点,借此机会记录一下方便以后查找. 本文主要分为以下几个部分: 1.进制的相互 ...

  8. Java异常的性能分析

    Java异常的性能分析 参考文章: (1)Java异常的性能分析 (2)https://www.cnblogs.com/grefr/p/6089116.html 备忘一下.

  9. java.lang.ArrayIndexOutOfBoundsException异常分析及解决

    2019独角兽企业重金招聘Python工程师标准>>> java.lang.ArrayIndexOutOfBoundsException异常分析及解决 这是一个非常常见的异常,从名字 ...

  10. 归并排序执行次数_归并排序过程、时间复杂度分析及改进

    前言 上一篇文章,介绍过第一种基于分治策略的排序算法--快速排序.接下来我们来讨论另一种基于分治策略的排序算法,归并排序.归并排序也被认为是一种时间复杂度最优的算法,我们还是按照基本过程,代码,最坏时 ...

最新文章

  1. 开发日记-20190704 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 10
  2. Keepalived工作原理
  3. 资讯|WebRTC M91 更新
  4. python pipeline框架_介绍Python的Django框架中的静态资源管理器django-pipeline
  5. android模拟器EditText 不能用物理键盘输入,也不能用电脑键盘输入
  6. linux小小输入法 不能中文,在centos 下安装小小输入法存在的问题
  7. [Unity] 战斗系统学习 2:FlowCanvas 中的 SubGraph
  8. Python生成1000个随机字符的字符串,统计每个字符的出现次数(choices函数和Counter的使用)
  9. 使用jQuery的load方法实现div局部刷新
  10. 【Navicat】Navicat:Navicat 导出数据库表为 EXCEL 格式、设计优化数据字典 EXCEL 模板
  11. 2020-10-10
  12. ConneR and the A.R.C. Markland-N--- codeforces1293A
  13. 折纸珠峰c语言程序,c语言折纸超过珠穆拉玛峰
  14. vue读取excel表格数据_vue 利用 js-xslx 读取 excel 表格文件
  15. 微信跳一跳游戏外挂(mac电脑+android手机)
  16. 皮卡洞察报告2021版——附下载链接
  17. 天津大学计算机课程设计挂,天津大学智能装置课程设计 电子时钟..doc
  18. oracle crm系统叫什么,目前市场上的CRM系统有哪些
  19. c plus第14章-详细解法+注释(欢迎一起讨论,顺带帮助我复习)
  20. 收银系统(Java简单版)

热门文章

  1. android消息提示框大小,android Toast設置彈框大小
  2. 【树莓派】设置树莓派开机自动运行python脚本
  3. SAP在阿里云白皮书-第二章 阿里云概念解析
  4. 数领科技|solidworks教程:如何打包solidworks工程文件
  5. 我工作用的电脑十年没重装过一次系统,我是如何做到的
  6. android 手机屏蔽广告 hosts
  7. 计算机通信的应用,计算机技术在通信中的应用
  8. 闪迪u盘量产工具万能版_加密保护,更高性能!闪迪酷奂CZ74 U盘新品果然够惊艳...
  9. Doris 运维篇:Apache Doris 如何定位处理问题的Tablet
  10. Ubuntu安装百度官方网盘客户端