【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 ...
随机推荐
- grunt-inline:一个资源内嵌插件
一.插件简介 将引用的外部资源,如js.css.img等,内嵌到引用它们的文件里去. 二.使用场景 在项目中,出于某些原因,有的时候我们需要将一些资源,比如js脚本内嵌到页面中去.比如我们的html页 ...
- css修改select下拉列表的默认样式
select的一些默认样式我们很难修改,比如图标的替换.接下来就说说如何修改这些默认样式: html代码: <div> <select name=""> & ...
- centos7 RabbitMQ部署
一.RabbitMQ简单介绍在日常工作环境中,你是否遇到过两个(多个)系统间需要通过定时任务来同步某些数据?你是否在为异构系统的不同进程间相互调用.通讯的问题而苦恼.挣扎?如果是,那么恭喜你,消息服务 ...
- linux AB web 性能测试工具
ab(选项)(参数) 选项 -A:指定连接服务器的基本的认证凭据: -c:指定一次向服务器发出请求数: -C:添加cookie: -g:将测试结果输出为“gnuolot”文件: -h:显示帮助信息: ...
- CMake与MSVC工程化实践
CMake与MSVC工程化实践 CMake基础 cmake无疑是最流行的c++跨平台构建工具之一,关于cmake入门指南这里不再赘述,官方文档是最好的参考,这里通过一个例子简述构建一个工程常用的函数和 ...
- gym101522 [小熊骑士限定]La Salle-Pui Ching Programming Challenge 培正喇沙編程挑戰賽 2017
西瓜队(划掉),Kuma Rider久违的第一场训练,四小时瞎打.jpg A.水题,排序 #include<cstdio> #include<iostream> #includ ...
- WebShell代码分析溯源(第1题)墨者学院
一.访问链接 二.下载系统源码后直接放到D盾里扫描,扫到后门文件 三.查看该木马文件 <?php error_reporting(0); $_GET['POST']($_POST['GET']) ...
- C# 词频统计 东北师范大学 软件项目管理 第一次作业
一.作为杨老师的学生第一次听杨老师讲课,印象最深的就是:工程中所有步骤之间是乘法,如果任何一步为0,工程就做不出来了.以前所有老师讲到的都是不要太在乎结果,努力的过程很重要,但是这在软件工程中不合适了 ...
- 四则运算level2
package j; import java.util.Scanner; public class Main { public static void main(String[] args) { Sc ...
- iOS中block循环引用问题
1.block是控制器对象的一个属性,则在block内部使用self将会引起循环应用 typedef void(^TestBlock)(); @interface SecondViewControll ...