冒泡排序(BubbleSort)

一、基本思想

将待排序的数组看成从上到下排放,把关键字值较小的记录看成“较轻的”,关键字值比较大的记录看成“较重的”,较小关键字值的记录好像水中的气泡一样,向上浮;较大关键字值的记录如水中的石块向下沉,当所有的气泡都浮到了相应的位置,并且所有的石块都沉到了水中,排序就结束了。

二、原理图解

假设待排序的6个记录的关键字序列为{3,9,-1,10,-2,3*},图解如下——

【注:带星号的关键字值相同,在此只是为了区分两个相同关键字值。】

第一趟:将前后数据元素进行对比,10是最大的,所以把10交换到最底下;

第二趟:排除掉{10},将剩下的数据元素继续前后对比,9是最大的,所以把9沉到次底下;

......

第五(n-1)趟:排除掉{-1,3,3*,9,10},只剩下-2,无需交换。

结束:得到有序序列{-2,-1,3,3*,9,10}。

三、算法步骤

假设记录存放在数组r中,开始时,有序序列为空,无序序列为{r[0],r[1],...,r[n-1]},则将冒泡排序算法的主要步骤归纳如下:

1)置初值1;

2)在无序序列{r[0],r[1],...,r[n-1]}中,从头至尾一次比较相邻的两个记录r[j]与r[j+1](0<=j<=n-i-1),若r[j].key>r[j+1].key,则交换位置。

3)i = i + 1。

4)重复步骤 2)和 3),直到步骤 2) 中 未发生记录交换或 i = n-1 为止。

大家看前面这段文字可能会觉得枯燥,难以理解,所以下面我再用自己的话通俗易懂地讲述一下代码实现的步骤:

使用双重循环——

内循环是为了遍历序列中每一个数据元素,通过前后对比,将最大的数据元素沉到最底下;

由于每内循环一次,只能将一个最大的数据元素沉到最底下,因此必须进行n-1趟(也就是案例中的5趟)排序才能够将所有的数据元素都沉到底下。

//优化

而这里还有一个局限性,就是外循环的次数其实并不一定需要进行n-1趟,举个栗子:如果待排序序列是局部有序的-{6,84,20,1,2,3,4},那么循环到第四趟的时候,就已经得到有序序列,如果继续循环,那将是没有意义的。

所以我们在这里再引入一个布尔变量flag,用来标记当前这一趟内循环有没有发生交换,如果没有,直接结束循环就可以得到最终序列。

四、代码实现

import java.util.Arrays;public class BubbleSort {public static void main(String[] args) {int arr[] = {3,9,-1,10,-2,3};System.out.println("排序前的数组:" + Arrays.toString(arr));//测试冒泡排序bubbleSort(arr);System.out.println("排序后的数组:" + Arrays.toString(arr));}public static void bubbleSort(int[] arr) {int temp = 0;  //临时变量boolean flag = false;  //标识变量,表示是否进行过交换for(int i = 0;i < arr.length - 1;i++) {for(int j = 0;j < arr.length - 1 - i;j++) {//如果前面的数比后面的数大,则交换if(arr[j] > arr[j + 1]) {flag = true;temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}    //打印每趟排序的结果System.out.println("第" + (i + 1) + "趟排序后的数组:");System.out.println(Arrays.toString(arr));if(flag == false) {break;}else {flag = false;  //重置flag,进行下次判断}}}
}

五、算法性能分析

1)空间复杂度。O(1)

2)时间复杂度。O(n2)

3)算法稳定性。

冒泡排序是一种稳定的排序算法。【案例中3和3*前后顺序保持不变】

Java | 基础算法 - 排序:冒泡排序 代码实现(含详细注释)相关推荐

  1. C语言 队列 的基本功能和详细代码(含详细注释)

    队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的规则FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 ...

  2. JAVA 基础入门课本例题代码(第二章)

    JAVA 基础入门课本例题代码(第二章) Example01 public class Example01 {public static void main (String[] ags){int nu ...

  3. java常用算法之冒泡排序简单例子

    为了更好的理解冒泡排序过程,下面举一个实例. 初始数组 118 101 105 127 112 一次排序 101 118 105 112 127 二次排序 101 105 118 112 127 三次 ...

  4. 冒泡排序Matlab程序超详细注释

    冒泡排序Matlab程序超详细注释 bubble_sort.m function y=bubble_sort(x) % %冒泡算法: x_len=length(x);%度量数量长度,为排序做准备 fo ...

  5. java 基础算法教程ppt,基础排序算法(附加java实现)

    七种最基本的排序算法:(面试必会!) 冒泡排序: 最基础的排序算法,从数列最前端开始,两两比较,如果前一个数比后一个数大,那么两个数就交换位置,经过一轮遍历之后,最大的数就到了数列的最后一个位置上,再 ...

  6. Java的知识点18——数组存储表格数据、冒泡排序的基础算法、冒泡排序的优化算法、二分法查找

    数组存储表格数据 package cn.dym08; import java.util.Arrays; public class Test09 {public static void main(Str ...

  7. java基数排序 数组_万字长文带你掌握Java数组与排序,代码实现原理都帮你搞明白!...

    查找元素索引位置 基本查找 根据数组元素找出该元素第一次在数组中出现的索引 public class TestArray1 { public static void main(String[] arg ...

  8. java基础算法题(入门题与简单题)

    题目来自lintcode,答案来自九章算术,将自己在lintcode上训练的一些简单算法题贴出来,作为知识的总结与整理.便于查看复习. 第一部分(入门级别,只做了开放的部分,大部分需要收费的VIP才有 ...

  9. Java基础算法题(01):判断101-200之间有多少个素数,并输出所有素数。 素数又叫质数,就是除了1和它本身之外,再也没有整数能被它整除的数。也就是素数只有两个因子。

    查看所有50道基础算法题请看: Java的50道基础算法题 import java.util.ArrayList; import java.util.List; public class Detect ...

  10. Java基础算法题(02):古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

    查看所有50道基础算法题请看: Java的50道基础算法题 递归的方法 package Demo02Rabbits; import java.util.Scanner; public class Ra ...

最新文章

  1. PHP数组实际占用内存大小的分析
  2. VB.NET实现DirectSound9 (6) 声音特效
  3. 关于排版中经常见的问题的解决方法
  4. python常用库教程_这几个python常用的库你必须知道!
  5. 使用MyBatis Generator自动生成实体、mapper和dao层
  6. 基础知识(十六)Opencv、python、ubuntu
  7. shell基础命令管理
  8. 【报告分享】中国年轻用户电商消费洞察报告:寻找电商换道增长机遇.pdf(附下载链接)...
  9. html5 机构化元素
  10. java实现代码在线编译器-从零开发(一)简单本地编译+运行测试
  11. sew制动器操作手册_SEW减速机中文操作手册
  12. 联想 Newifi mini Y1 Padavan固件设置5Ghz桥接
  13. Windows组策略禁止广告弹窗
  14. excel编程系列基础:认识VBA的编辑器VBE
  15. JAVA计算机毕业设计中华二十四节气文化传承宣展平台Mybatis+源码+数据库+lw文档+系统+调试部署
  16. 零基础程序员自学编程有这 6 种方法,你的自学方法是合理的么?
  17. 【火狐】如何隐藏最近的书签、历史、关闭的页面
  18. Revit开发 - 显示(ShowElements)
  19. Mysql服务端(三)--- 索引及设计建议
  20. 新辰:舌尖上的中国2推起长沙90后糕富帅创业:买买提切糕店

热门文章

  1. 流程图里的形状符号的代表意义
  2. CrossApp的环境配置教程Windowsmac
  3. Chrome开发者调试工具Copy element和Copy OuterHTML区别
  4. ACM/ICPC World Finals 2012 B Curvy Little Bottles
  5. 斐讯路由器使用说明,校园网破解,breed控制台,华硕固件
  6. bp神经网络误差反向传播,bp神经网络结果不一样
  7. 饥荒联机建立好服务器找不到,饥荒联机版浏览世界找不到已经创建的世界 | 手游网游页游攻略大全...
  8. 前往庄园失败 当前服务器不稳定,摩尔庄园手游登录不了是怎么回事 摩尔庄园手游登录失败怎么办...
  9. html5颜色选择按钮,H5的input color系统颜色选择器
  10. jtopo 把节点做成背景图效果