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: ...
随机推荐
- "《算法导论》之‘线性表’":双向循环链表
本文双链表介绍部分参考自博文数组.单链表和双链表介绍 以及 双向链表的C/C++/Java实现. 1 双链表介绍 双向链表(双链表)是链表的一种.和单链表一样,双链表也是由节点组成,它的每个数据结点中 ...
- 安卓TV开发(前言)— AndroidTV模拟器初识与搭建
原文:http://blog.csdn.net/sk719887916/article/details/39612577skay 前言:移动智能设备的发展,推动了安卓另一个领域,包括智能电视和智能家居 ...
- C语言算法--统计字符串中单词的个数
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(void) { int le ...
- SharePoint 解决方案手动打包简单介绍
介绍:在使用SharePoint中,我们经常需要做的就是打包解决方案,我们来介绍下SharePoint解决方案的手动部署,我自己觉得,解决方案是SharePoint中非常好的一个功能,部署和使用起来相 ...
- JSP 分页显示数据 (Oracle)
要实现分页,首先我们要做的就是如何来编写SQL语句,网上也有很多,大家可以搜一下.在这里,我们使用一种比较常用的方式来编写SQL语句.代码如下: ----分页显示 select * from (sel ...
- The 13th tip of DB Query Analyzer, powerful processing EXCEL file
The 13thtip of DB Query Analyzer, powerful processing EXCEL file MA Genfeng (Guangdong UnitollServic ...
- javascript属性访问表达式
属性访问表达式运算得到一个对象属性或一个数组元素的值.js为属性访问定义了2中语法: expression.identifier expression["expression"] ...
- 合法的json数组字符串,转换json
List list = JSON.parseArray("[{'id':1,'name':'a'},{'id':2,'name','b'}]", JSONObject.class) ...
- IT轮子系列(六)——Excel上传与解析,一套代码解决所有Excel业务上传,你Get到了吗
前言 在日常开发当中,excel的上传与解析是很常见的.根据业务不同,解析的数据模型也都不一样.不同的数据模型也就需要不同的校验逻辑,这往往需要写多套的代码进行字段的检验,如必填项,数据格式.为了避免 ...
- 别跟我谈EF抵抗并发,敢问你到底会不会用EntityFramework
前言 一直以来写的博文都是比较温婉型的博文,今天这篇博文算是一篇批判性博文,有问题欢迎探讨,如标题,你到底会不会用EntityFramework啊. 你到底会不会用EntityFramework啊 面 ...