码迷,mamicode.com
首页 > 编程语言 > 详细

Java基础系列--冒泡排序

时间:2018-05-20 20:13:36      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:复杂度   简单   rgs   空间   渐进   编程算法   使用   public   初学   

原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9064218.html

1、算法简介

  冒牌排序是很耳熟的排序方式,虽然它使用的很少,但是经常会出现在面试中,冒泡的意思是渐进式的意思,即渐进式排序。

2、算法原理

  冒泡排序就是通过相邻元素的两两比较交换的方式实现排序,每次比较的两个元素中都包含上一次比较的后一位元素,也就是每次比较替换之间都是存在关联的,那个关联的元素一步步向后移,就好比冒泡一般,直到水面(排好序)。

  每次冒泡的结束都意味着一个元素的归位,即一个元素被排好序,一般我们都是采用向后冒泡的方式来实现排序的,那么也就意味着,元素归位的顺序是从尾部开始的。

  而每次冒泡又都是从首位元素开始的,到未被排序的最后一位结束。那么也就意味着每次冒泡的比较次数要比上一次冒泡少1次,因为每结束一次冒泡就会在末尾完成一个元素的排序,而未排序的元素相应的就会少一位。

  了解上面的这些,这有利于我们实现编程算法,但初学者必定是一头雾水,不要急,你需要在参考下面实现源码的基础上再理解上面的内容,那么你会加深理解。

3、算法实现

 1 public class BubbleSort {
 2 
 3     public static void main(String[] args) {
 4         int[] ints = {2, 6, 4, 9, 12, 98, 5, 32, 90, 33, 24, 65, 37, 12, 4};
 5         sort(ints);
 6     }
 7 
 8     public static void sort(int[] ints){
 9         for(int i = ints.length - 1; i > 0; i--) {
10             for(int j = 0; j < i; j++) {
11                 if(ints[j] > ints[j + 1]){
12                     int temp = ints[j];
13                     ints[j] = ints[j + 1];
14                     ints[j + 1] = temp;
15                 }
16             }
17         }
18         for(int i : ints) {
19             System.out.print(i + " ");
20         }
21     }
22 }

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--,正好实现了我们的目的,而正因如此,我们每次冒泡结束的时候并不是末尾,而是未排序元素末位,这个末位会随着冒泡逐次前移,每次一位,直到第二位进行末次冒泡进而完成排序。

  忘了说一点,这里j<i,为什么不是i-1,或者i+1呢?因为在我们每次冒泡的最后一次比较中,都是末位和末位前的两位元素比较,然后就结束了,并不是比较剩余未排序元素个数次,而是个数减1次,这里j<i,正好就是减1次。

  冒泡排序的精髓就在这两层循环之内,完全理解其意之后,实现起来就很简单了。

4.1、时间复杂度

  冒泡排序外层循环执行次数为n-1次,这里n代表序列元素个数,内循环次数为n(n-1)/2次,冒泡排序算法的时间复杂度为O(n2)。

4.2、空间复杂度

  冒泡排序算法中会用到临时空间用于元素交换,通过优化,我们可以实现,空间复杂度为O(1)。

5、总结

  冒泡排序现在更多的是出现在一些面试题里面,用于查看面试者的只是扩展度,实际使用中很少用到了,因为这种算法的时间复杂度还是不如人意。现在使用较多的还是快速排序算法。

 

  

  

Java基础系列--冒泡排序

标签:复杂度   简单   rgs   空间   渐进   编程算法   使用   public   初学   

原文地址:https://www.cnblogs.com/V1haoge/p/9064218.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!