【DS】排序算法之冒泡排序(Bubble Sort)
一、算法思想
冒泡排序是排序算法中比较有意思的一种排序方法,也很简单。其算法思想如下:
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)的更多相关文章
- java排序算法之冒泡排序(Bubble Sort)
java排序算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数 ...
- 【排序算法】冒泡排序(Bubble Sort)
0. 说明 参考 维基百科中的冒泡排序 冒泡排序 (Bubble Sort) 是与插入排序拥有相等的执行时间,但是两种算法在需要的交换次数却很大地不同. 在最坏的情况,冒泡排序需要 O(n2) 次交 ...
- Java中的经典算法之冒泡排序(Bubble Sort)
Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...
- 快速排序算法回顾 --冒泡排序Bubble Sort和快速排序Quick Sort(Python实现)
冒泡排序的过程是首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换,然后比较第二个记录和第三个记录的关键字.以此类推,直至第n-1个记录和第n个记录的关键字进行过比较为止 ...
- c#经典算法之冒泡排序(Bubble Sort)
转载于:https://www.cnblogs.com/shen-hua/p/5422676.html 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面, ...
- 分享知识-快乐自己:Java中的经典算法之冒泡排序(Bubble Sort)
原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将 ...
- 基础算法之冒泡排序Bubble Sort
原理 将相邻的数据两两进行比较,按照从小到大或者从大到小的顺序进行位置交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后从头开始再次进行两两比较交换,直到倒数第二位时结束.按照此规则,若干 ...
- 排序算法--冒泡排序(Bubble Sort)_C#程序实现
排序算法--冒泡排序(Bubble Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来非常困 ...
- Java常见排序算法之冒泡排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
- 冒泡排序(Bubble Sort),比较次数优化改进
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
随机推荐
- ECC检验与纠错
引入ECC ECC:Error Checking and Correction,是一种差错检测和修正的算法. NAND闪存在生产和使用中都会有坏块产生,BBM就是坏块的管理机制.而生产坏块已经无法避免 ...
- 开发工具之Spark程序开发详解
一 使用IDEA开发Spark程序 1.打开IDEA的官网地址,地址如下:http://www.jetbrains.com/idea/ 2.点击DOWNLOAD,按照自己的需求下载安装,我们用免费版 ...
- OD之修改文件标题(一)
OD是逆向工程中的一个重要工具,逆向工程调试说明具体请参考:百度百科,OD介绍,当然就我了解而言,俗话就是破解软件,市面上的什么破解版,精简版啥的基本都是通过这种技术的,但是这并不能一概而论说逆向工程 ...
- mac10.12.6系统配置clion编写CMakeLists文件运行opencv3
按照mac10.12.6系统使用cmake安装opencv3.3.0+opencv_contrib-3.3.0下载编译安装好了文件以后,装好clion编译器,新建C++可执行工程,编写代码 opecv ...
- MVC模式简单的Xml文档解析加Vue渲染
前端代码: <script src="~/Js/jquery-3.3.1.min.js"></script> <script src="~/ ...
- 团队项目M1展示成绩和Week 10分数
根据M1项目评审的分数,分档打分得到的M1项目成绩.
- 一个java实现的简单的4则运算器
有些基础知识有欠缺,补一下,顺便练习一下java import com.sun.deploy.util.ArrayUtil; import java.util.*; public class Main ...
- 修改servlet的模板代码
实际开发中,这些生成的代码和注释一般我们都用不到的,每次都要手工删除这些注释和代码,很麻烦.下面以MyEclipse 2014(其实版本通用的,都可以修改)为例进行说明如何修改Servlet的模板代码 ...
- ns3 myfirst.cc 两个节点点对点通信
首先在ns3.25/examples/tutorial/下找到 first.cc文件,将他拷贝到到scratch目录下. 然后为了方便将代码打出来 /* -*- Mode:C++; c-file-st ...
- ubuntu 12.04下 eclipse的安装
1首先下载有关的JDK sudo apt-get install openjdk-7-jre 由于是源内的东西,所以只许执行上面这一步,就自动帮你下载 安装 以及配置,无需繁琐的操作. 这里ubunt ...