冒泡排序?了解一下!
Posted 达内首都教学部
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序?了解一下!相关的知识,希望对你有一定的参考价值。
各位同学,今天我们来聊一聊数组的冒泡排序,可能大家会有点吃惊,为什么要聊这么简单的话题呢?的确,数组有很多种排序方式,比如:选择排序 、插入排序、快速排序等方法,甚至于Java为我们提供了Array.short( )这样更直接的方法,为什么我们还要专门来聊冒泡排序呢?
原因其实很简单,就是因为面试的时候经常会遇到冒泡排序,而且虽然冒泡排序很简单,简单到只有短短的6行代码,但是还是有很多同学马失前蹄。今天我们就一起来聊一聊吧。
首先要给数组排序我们当然需要一个数组了,第一步我们就声明一个长度为5的整形数组吧。
int [] array = new int[]{84, 99, 36, 5, 52};
第二步当然是来分析如何冒泡了;
冒泡排序原理其实大家都比较清楚了,也就是在数组内将数组元素根据顺序两两相互比较。如果是从大到小顺序,那么两个元素相互比较,大的会排在前面;反之,会排在后面。冒泡排序分为从大到小排序和从小到大排序。(咱们这里按从小到大排序为例)按照这个逻辑我们这个数组要想通过冒泡排序拍出来总共需要比较4轮。
第一轮:
第一次:84和99比
84<99 换 {84, 99, 36, 5, 52};
第二次:99和36比
99>36 换 {84, 36, 99, 5, 52};
第三次:99和5比
99>5 换 {84, 36, 5, 99, 52};
第四次:99和52比99>52 换 {84, 36, 5, 52, 99};
第二轮:
第一次:84和36比84>36 换 {36, 84, 5, 52, 99};
第二次:84和5比84>5 换 {36, 5, 84, 52, 99};
第三次:84和52比84>52 换 {36, 5, 52, 84, 99};
第三轮:
第一次:36和5比36>5 换 {5, 36, 52, 84, 99};
第二次:36和52比36<52 不换 {5, 36, 52, 84, 99};
第四轮:
第一次:5和36比5<36 不换 {5, 36, 52, 84, 99};
经过分析我们发现4轮干的事是一样的,就是数字与数字进行比大小,所以我们毫无疑问的需要选择for循环。我们还会发现我们的数组长度是5,而只需要比4次,是因为数组中最后一个数,前面每一个数和其他数比的时候他都参与了,所以最后它没必要再和其他数进行比较,这样我们就可以得出比的轮数就是数组的长度减去1.这样for循环的结构我们就得出来了:
for(int i=0;i<array.length-1;i++){
}
每一轮都从第1个元素开始与其他元素比,每一次都是和它的下一个元素比,需要比3次,每一次又是做同样的事情,所以我们需要在表示轮数for循环内再套一层表示某一个固定数字和其他数对比次数的for循环。第一轮比4次,第2轮比3次,第3轮比2次……,咱们会发现,第几轮比几次就是数组的长度减去本轮轮数就是本轮要比的次数。表示次数for循环的条件我们就可以得出了,次数小于数组长度减去本轮轮数。所以我们可以得出:
光知道需要使用双层for循环结构还不行,第三步我们需要来分析每一次比较以后数组本身的变化,我们拿第一轮来举例:咱们假定数组的第一个元素为最大元素,int max = 84;那么拿最大的元素和其他元素进行对比,如果其他元素大于咱们假定的最大元素,那么咱们所假定的最大元素就不是数组中的最大元素,咱们就用比它大的元素将它替换。比如84和99比,84<99,那么就用99替换掉84,max=99,以此类推,再用99和其他元素对比,如果没有比99更大的元素,那么99就是最大元素,放在最后一个位置。这样第一轮就把99冒出来了,再进行第二轮,经过第一轮排序后数组位置发生变化:{84, 36, 5, 52, 99};
第二轮再把84假定为最大元素,重复第一轮的工作,将找到的最大的元素放在数组的array.leng-2的位置第三轮,第四轮同样的道理,直到排序完成。根据这一方法我们可以得出如下代码:
综上我们就可以得出完整的冒泡排序的代码了。
怎么样?是不是忽然感觉茅塞顿开了呢?
往期精彩:
以上是关于冒泡排序?了解一下!的主要内容,如果未能解决你的问题,请参考以下文章