前言
从刚开始接触编程语言,会的第一个排序就是冒泡了,但是我这个金鱼记忆,总是会把这个最基础的排序算法“忘”了,也不算忘了吧,就是模模糊糊,似会非会,今天下决心一定要彻底把它融入我的大脑之中,成为技术之路上的奠基石,下面我要开始我的表演了
冒泡排序官方解释
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
为什么叫冒泡排序呢
冒泡嘛,就一个一个的冒出来,一堆数,他们大小顺序乱七八糟,但是经过冒泡排序之后,这些乱七八糟的数字,就会乖乖的从最小到最大(或者从最大到最小)的开始冒出来,1。。。2.。。。3.。。。就这样一个个冒出来
排序实例
文字太干涩,我们拿一串数来实际分析,以:1 8 5 4 7 为例
我们按从小到大的排序出来,那么根据冒泡的定义,第一个冒出来的可以是8(当然也可以是1),我们来看如何通过两两比较将8冒出来
原数组:1 8 5 4 7
第一个位置(1)和下一个位置(8)比较,1更小不交换,数组变成如下形式:1 8 5 4 7
第二个位置(8)和下一个位置(5)比较,8比5大,交换,数组变成如下形式:1 5 8 4 7
第三个位置(8)和下一个位置(4)比较,8比4大,交换,数组变成如下形式:1 5 4 8 7
第四个位置(8)和下一个位置(7)比较,8比7大,交换,数组变成如下形式:1 5 4 7 8
如上第一趟排序完成,8成为最大的冒泡出来并在最后边位置
接下来只需要进行和如上类似的排序就可以把7冒出来冒到8前面,因为第一个位置的1已经冒完了,所以我们只需要从第二个位置开始冒泡就行了
数组:1 5 4 7 8
第二个位置(5)和下一个位置(4)比较,5比4大,交换,数组变成如下形式:1 4 5 7 8
第三个位置(5)和下一个位置(7)比较,5更小,不交换,数组变成如下形式:1 4 5 7 8
第四个位置(7)和下一个位置(8)比较,7更小,不交换,数组变成如下形式:1 4 5 7 8
这就完成了第二趟排序 1 4均是冒泡成功的,由此应该可以发现,每次冒泡都会成功的冒出一位数字,那每次冒泡需比较的次数也会少1
接下来的第三次冒泡我就不实际讲解了:结果肯定是1 4 5 7 8(5 7 8冒成功了)
第四次:1 4 5 7 8 (1 4 5 7冒成功了,也就是1 4 5 7 8了,4要冒出来绝对要和1比较的,这个就不多说了)
冒泡排序总结:
其实冒泡就像小时候,老妈让我们和一堆人比身高是一个道理,假设你是最高的,原本应该排在最后一个位置,但是开始你站在第1个位置,你先和旁边的小明比,小明没你高,你和他换位置,然后你一直和下一个人比,自然最后你会排到最后一个位置了
冒第一个数,比较length - 1次
冒第二个数,比较length-2次
冒第三个数,比较length-3次,。。。。
排序Java代码
根据总结:
冒第一个数,比较length - 1次
冒第二个数,比较length-2次
冒第三个数,比较length-3次,。。。。
两个for循环先实现冒泡的框架,中间一个if实现具体每次冒泡的比较
for (int i = 0; i < list1.length - 1; i++) { //第一个循环冒最大的数,第二个循环冒第二大的数
//比较的次数,从i 开始到length就可以有效的控制比较的次数,i逐渐增加,比较的次数逐渐减小
for (int j = i; j <list1.length - 1; j++) {
// 比较相邻的元素,如果前面的数大于后面的数,则交换,这里就是在实现每冒一个数做的那些比较
if (list1[j] > list1[j+1]) {
temp = list1[j ];
list1[j ] = list1[j+1];
list1[j+1] = temp;
}
}
//下面就是简单的输出了
System.out.print("第"+i+"趟:");
for (int k = 0; k < list1.length; k++) {
System.out.print(list1[k]+" ");
}
System.out.println();
}
总结
写完事了,其实冒泡对于初学者理解的唯一方法就是多写,多自己排发现其本质,逐渐你就会对它代码的实现有所了解的,不能一口气吃成大胖子,记得当时学也是很懵,就这样了,笔记完成·····技术是一辈子的事,千万别学一点丢一点