一、算法思想

冒泡排序是排序算法中比较有意思的一种排序方法,也很简单。其算法思想如下:

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

2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

3)针对所有的元素重复以上的步骤,除了最后一个。

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

二、算法示意图

这幅图形象的展示了冒泡的过程,最左边一列,从下往上显示了等待排序的数列,最后一列则显示了冒泡排序的最终结果。每一列阴影的部分代表等待排序的数列,黄色部分表示排序完成的部分,冒泡过程中不需要涉及黄色部分,我们解释一下第二列的形成过程:

第二列在冒泡过程中(从下往上看),首先比较2和3,2<3,则交换;比较3和4,4>3,不需要交换;比较4和9,9>4,不需要交换,比较1和9,1<9,交换;比较5和9,5<9,交换;比较7和9,7<9,交换;比较6和9,6<9,交换;比较8和9,8<9,交换。这样就形成了第二列。第二列形成以后,9,也就是最后的数字已经是最大的了,第二趟这样进行形成第三列的时候,就不需要进行到9了。

每一趟冒泡,都是将灰色数列部分中最大的数字选择出来放到黄色部分的最下层,由此形成下一列,最大数字的选择是通过数字的交换来完成的——算法会从数列的最前端开始往后遍历,如果发现某一个数比它前面的数字小,就会进行交换,把较大的数字往后移动。由此不断进行,就可以将最大的数字移动到数列灰色部分的最后。

三、Java代码

 //@wiki
public class BubbleSort extends Sort {
public static void sort(int[] array) {
int temp = 0;
for (int i = array.length - 1; i > 0; --i) {
for (int j = 0; j < i; ++j) {
if (array[j + 1] < array[j]) {
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
}

四、算法复杂度

从上面的Java代码来看,第7行的比较是一定会进行的,假设数组元素是n,则进行的次数是:n*(n-1)/2。因为j是从0~i-1,而i是从n-1~1,所以简单计算就可以得出以上的结果。

最差的情况当然是每次都执行if条件判断,并且执行其中的8,9,10三行语句,整体复杂度为4*n^2。出现最坏的情况就是一开始数列是倒叙排列的,即按照从大到小的顺序排列的,导致每一次比较都需要交换。

在本代码中,最好的情况其实不能达到,我们去看示意图,我们发现五列已经完成了排序,第6,7,8列的排序过程其实可以省略。所以,冒泡排序可以优化,我们增加一个flag,当一趟冒泡完成时我们发现没有发生交换行为,就可以终止冒泡了,其代码如下:

 public class BubbleSort extends Sort {
public static void sort(int[] array) {
int temp = 0;
for (int i = array.length - 1; i > 0; --i) {
boolean exchange = false;
for (int j = 0; j < i; ++j) {
if (array[j + 1] < array[j]) {
exchange = true;
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
if(!exchange)
return;
}
}
}

如上,这样,我们可以将最好的复杂度降低为n,情况出现在数列一开始就是从小到大排列的时候,只需要遍历一边,exchange始终为false,直接返回,这样就可以得到最好的时间复杂度,为O(n),因此平均时间复杂度为O(n^2)。

空间复杂度非常容易,由代码可以看出来,只需要一个位置temp用于交换即可,因此是O(1)。

【DS】排序算法之冒泡排序(Bubble Sort)的更多相关文章

  1. java排序算法之冒泡排序(Bubble Sort)

    java排序算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数 ...

  2. 【排序算法】冒泡排序(Bubble Sort)

    0. 说明 参考 维基百科中的冒泡排序 冒泡排序 (Bubble Sort) 是与插入排序拥有相等的执行时间,但是两种算法在需要的交换次数却很大地不同. 在最坏的情况,冒泡排序需要 O(n2)  次交 ...

  3. Java中的经典算法之冒泡排序(Bubble Sort)

    Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...

  4. 快速排序算法回顾 --冒泡排序Bubble Sort和快速排序Quick Sort(Python实现)

    冒泡排序的过程是首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换,然后比较第二个记录和第三个记录的关键字.以此类推,直至第n-1个记录和第n个记录的关键字进行过比较为止 ...

  5. c#经典算法之冒泡排序(Bubble Sort)

    转载于:https://www.cnblogs.com/shen-hua/p/5422676.html 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面, ...

  6. 分享知识-快乐自己:Java中的经典算法之冒泡排序(Bubble Sort)

    原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将 ...

  7. 基础算法之冒泡排序Bubble Sort

    原理 将相邻的数据两两进行比较,按照从小到大或者从大到小的顺序进行位置交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后从头开始再次进行两两比较交换,直到倒数第二位时结束.按照此规则,若干 ...

  8. 排序算法--冒泡排序(Bubble Sort)_C#程序实现

    排序算法--冒泡排序(Bubble Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来非常困 ...

  9. Java常见排序算法之冒泡排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  10. 冒泡排序(Bubble Sort),比较次数优化改进

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

随机推荐

  1. Java 多线程(二)之 Thread 优先级

    目录 Thread 中线程优先级相关属性 相关函数 优先级初始化 设置优先级 获取优先级 默认优先级 指定优先级 注意事项 优先级继承 @ Thread 中线程优先级相关属性 每个线程均有优先级,在 ...

  2. MySQL在x64系统上1067问题解决

    最近一个项目需要用到MYSQL,因为以前也弄过,所以就没怎么多想,直接下一个完事了.于是乎果断上官方网站下了一个installer(5.26),修改了一下默认位置和配置,然后一路next,最后在配置完 ...

  3. BugkuCTF web2

    前言 写了这么久的web题,算是把它基础部分都刷完了一遍,以下的几天将持续更新BugkuCTF WEB部分的题解,为了不影响阅读,所以每道题的题解都以单独一篇文章的形式发表,感谢大家一直以来的支持和理 ...

  4. 在Windows上安装配置Git

    用安装 https://git-scm.com/ 官网下载安装包 (官网有安装步骤 https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-%E5%AE%8 ...

  5. Unity2D 面向目标方向

    在2d空间上,假设角色的自身的y轴方向为正方向,如果要让角色随时面向一个目标点. 这里假设(0,0)点为目标点 第一种: Vector3 v = Vector3.zero - transform.po ...

  6. 每日scrum(5)

    进入冲刺第五天,软件的界面设计成为主打,收集学校的很多美图是我们组的任务: 问题在于软件已很难有很大的改进,大方向也都是变不了的 任务看板: 燃尽图:

  7. C语言编程—自动生成四则运算升级版

    #include<stdio.h> #include<time.h> struct fenshu { int fenzi; int fenmu; }Fenshu[]; int ...

  8. 免费SSL证书申请 2018年至简教程

    Let’s Encrypt是国外一个公共的免费SSL项目,由 Linux 基金会托管,它的来头不小,由Mozilla.思科.Akamai.IdenTrust和EFF等组织发起,目的就是向网站自动签发和 ...

  9. Entity Framework(EF) Code First将实体中的string属性映射成text类型的几种方式

    1.通过ColumnType属性设置 [Column(TypeName="text")] public string Text { get; set; } 在进行以上属性设置时,请 ...

  10. GCD LCM UVA - 11388 (思维。。水题)

    两个数的最小公倍数和最大公约数肯定是倍数关系 然后又让求使得a最小  因为 a = m * gcd 令m = 1 时 a取得最小  即gcd 则b = lcm #include <iostrea ...