Java基础系列--冒泡排序
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9064218.html
1、算法简介
冒牌排序是很耳熟的排序方式,虽然它使用的很少,但是经常会出现在面试中,冒泡的意思是渐进式的意思,即渐进式排序。
2、算法原理
冒泡排序就是通过相邻元素的两两比较交换的方式实现排序,每次比较的两个元素中都包含上一次比较的后一位元素,也就是每次比较替换之间都是存在关联的,那个关联的元素一步步向后移,就好比冒泡一般,直到水面(排好序)。
每次冒泡的结束都意味着一个元素的归位,即一个元素被排好序,一般我们都是采用向后冒泡的方式来实现排序的,那么也就意味着,元素归位的顺序是从尾部开始的。
而每次冒泡又都是从首位元素开始的,到未被排序的最后一位结束。那么也就意味着每次冒泡的比较次数要比上一次冒泡少1次,因为每结束一次冒泡就会在末尾完成一个元素的排序,而未排序的元素相应的就会少一位。
了解上面的这些,这有利于我们实现编程算法,但初学者必定是一头雾水,不要急,你需要在参考下面实现源码的基础上再理解上面的内容,那么你会加深理解。
3、算法实现
public class BubbleSort {
public static void main(String[] args) {
int[] ints = {2, 6, 4, 9, 12, 98, 5, 32, 90, 33, 24, 65, 37, 12, 4};
sort(ints);
}
public static void sort(int[] ints){
for(int i = ints.length - 1; i > 0; i--) {
for(int j = 0; j < i; j++) {
if(ints[j] > ints[j + 1]){
int temp = ints[j];
ints[j] = ints[j + 1];
ints[j + 1] = temp;
}
}
}
for(int i : ints) {
System.out.print(i + " ");
}
}
}
4、算法解析
从上面的代码中我们进行原理的解析,这样可以加深对原理的理解,我们学习算法并不是为了背诵这么一段简单的代码,我们学的是原理,是思维,虽然我也无法完全做到,但努力中,因为在我们完全理解了其原理之后,代码实现起来就会相当相当的容易,再也不用去背代码。
冒泡排序的实现代码中第9行为外层循环,用于控制冒泡的次数,正如原理中所说,冒泡排序是从尾部开始的,所以我们的循环变量i从尾部开始循环,末尾元素下标即为ints.length-1,i的变化范围为i>0,这里不包含0 的原因是因为当我们把序列的ints.length-1个元素排好序之后,只剩余一位元素,那么这一位元素自动就已经排好序了,无需再次冒泡,若为从小到大排序,那么最后剩余的元素就是首位元素,它即为最小的元素,不用再次执行冒泡排序。那么我们就得知外层循环控制的冒泡的次数为序列的长度减1次。
第10行的内容为内层循环,由于每次冒泡我们都是从首位元素开始,慢慢右移到末位(这里的末位并非末尾),一次冒泡是由有数次的两两比较交换(第11到14行代码)实现的,所以我们的代码中内循环变量j=0,表示每次都是从0下标元素开始冒泡,j的变化范围为j <i,这里是我们的重点,是内外层循环的关联点,我们每次冒泡比较的次数都是不同的,细心点就会发现,每次次数都会少一次,这个逻辑的控制就在这里,j小于i,而i在每次冒泡开始前都会执行i--,正好实现了我们的目的,而正因如此,我们每次冒泡结束的时候并不是末尾,而是未排序元素末位,这个末位会随着冒泡逐次前移,每次一位,直到第二位进行末次冒泡进而完成排序。
冒泡排序的精髓就在这两层循环之内,完全理解其意之后,实现起来就很简单了。
4.1、时间复杂度
冒泡排序外层循环执行次数为n-1次,这里n代表序列元素个数,内循环次数为n(n-1)/2次,冒泡排序算法的时间复杂度为O(n2)。
4.2、空间复杂度
冒泡排序算法中会用到临时空间用于元素交换,通过优化,我们可以实现,空间复杂度为O(1)。
5、总结
冒泡排序现在更多的是出现在一些面试题里面,用于查看面试者的只是扩展度,实际使用中很少用到了,因为这种算法的时间复杂度还是不如人意。现在使用较多的还是快速排序算法。
Java基础系列--冒泡排序的更多相关文章
- 2015年12月28日 Java基础系列(六)流
2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流
- Java基础系列--static关键字
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8477914.html 一.概述 static关键字是Java诸多关键字中较常使用的一个,从 ...
- Java基础系列-ArrayList
原创文章,转载请标注出处:<Java基础系列-ArrayList> 一.概述 ArrayList底层使用的是数组.是List的可变数组实现,这里的可变是针对List而言,而不是底层数组. ...
- Java基础系列-Collector和Collectors
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/10748925.html 一.概述 Collector是专门用来作为Stream的coll ...
- Java基础系列-二进制操作
原创文章,转载请标注出处:<Java基础系列-二进制操作> 概述 Java源码中涉及到大量的二进制操作,非常的复杂,但非常的快速. Java二进制表示法 首先了解下二进制,二进制是相对十进 ...
- Java基础系列-equals方法和hashCode方法
原创文章,转载请标注出处:<Java基础系列-equals方法和hashCode方法> 概述 equals方法和hashCode方法都是有Object类定义的. publi ...
- Java基础系列-Comparable和Comparator
原创文章,转载请标注出处:<Java基础系列-Comparable和Comparator> 一.概述 Java中的排序是由Comparable和Comparator这两个接 ...
- Java基础系列--HashMap(JDK1.8)
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/10022092.html Java基础系列-HashMap 1.8 概述 HashMap是 ...
- 夯实Java基础系列1:Java面向对象三大特性(基础篇)
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 [https://github.com/h2pl/Java-Tutorial](https: ...
随机推荐
- GDI+ 读取jpg图片每个像素的值
// 读取jpg图像像素rgb值.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #in ...
- OpenCV 矩形轮廓检测
转载请注明出处:http://blog.csdn.net/wangyaninglm/article/details/44151213, 来自:shiter编写程序的艺术 基础介绍 OpenCV里提取目 ...
- 安卓笔记-可以滚动的TextView
本来是想做一个显示文字信息的,当文字很多时View的高度不能超过一个固定的值,当文字很少时View的高度小于那个固定值时,按View的高度显示.因为ScrollView没有maxHeight,无法满足 ...
- 如何使用firefox适用于javascript的debugger命令
首先安装firebug,在firefox的扩展里搜索安装即可. 然后在页面中启用firebug中的脚本: 然后在网页某些位置加入debugger命令,比如如下页面代码: <!DOCTYPE ht ...
- Java小技巧输出26个英文字母
相信有的童鞋写到过与字母有关的小东西,是否有写过全部的字母呢?26个这么多字母,一个个打会疯掉.所有咱们可以用一个小技巧使用for循环帮我们把26个字母自动搞出来,大家来瞅一眼把! 使用Java遍历2 ...
- TCP / IP,HTTP
大学学习网络基础的时候老师讲过,网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层.通过初步的了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用 ...
- VueJs(9)---组件(父子通讯)
组件(父子通讯) 一.概括 在一个组件内定义另一个组件,称之为父子组件. 但是要注意的是:1.子组件只能在父组件内部使用(写在父组件tempalte中); 2.默认情况下,子组件无法访问父组件上的数据 ...
- python结巴(jieba)分词
python结巴(jieba)分词 一.特点 1.支持三种分词模式: (1)精确模式:试图将句子最精确的切开,适合文本分析. (2)全模式:把句子中所有可以成词的词语都扫描出来,速度非常快,但是不能解 ...
- CentOS6.5 64位下安装部署Ansible
这里使用的软件包为一下版本 Python-2.7.12.tgz pip-9.0.1.tar.gz ansible-2.2.0.0.tar.gz 其他依赖包使用pip方式安装 方便说明做以下设定: 控制 ...
- MariaDB/MySQL备份和恢复(一):mysqldump工具用法详述
本文目录:1.备份分类2.备份内容和备份工具3.mysqldump用法详述 3.1 语法选项 3.1.1 连接选项 3.1.2 筛选选项 3.1.3 DDL选项 3.1.4 字符集选项 3.1.5 复 ...