冒泡排序花式玩法
Posted 三更编程菌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序花式玩法相关的知识,希望对你有一定的参考价值。
走过路过不要错过
今天不讲别的,聊一聊我们最常用的排序,很有趣的一个排序方法~,闲话不多说,直接上题,给你一堆无序的数字,让你对它们进行从小到大的排序,你该怎么操作?例如下面这些数字:4,2,3,1,6,5
我先介绍一下我第一感觉会想到的方法,就是每一趟的数字比较,找出其中的最小值,放到最前面,找到第二小的,放到第二个位置上,以此类推...直到所有数字比较完成。
第一趟排序:
【1】4和2比较,4大于2,交换位置: 2 4 3 1 6 5
【2】2和3比较,2小于3,不交换位置:2 4 3 1 6 5
【3】2和1比较,2大于1,交换位置: 1 4 3 2 6 5
【4】1和6比较,1小于6,不交换位置:1 4 3 2 6 5
【5】1和6比较,1小于6,不交换位置:1 4 3 2 6 5
第一趟总共进行了5次比较, 排序结果: 1 4 3 2 6 5
----------------------
第二趟排序:
【1】4和3比较,4大于3,交换位置: 1 3 4 2 6 5
【2】3和2比较,3大于2,交换位置: 1 2 4 3 6 5
【3】2和6比较,2小于6,不交换位置:1 2 3 4 6 5
【4】2和5比较,2小于5,不交换位置:1 2 3 4 6 5
第二趟总共进行了4次比较, 排序结果:1 2 3 4 6 5
----------------------
第三趟排序:
【1】3和4比较,3小于4,不交换位置:1 2 3 4 6 5
【2】3和6比较,3小于6,不交换位置:1 2 3 4 6 5
【3】3和5比较,3小于5,不交换位置:1 2 3 4 6 5
第三趟总共进行了3次比较, 排序结果:1 2 3 4 6 5
----------------------
第四趟排序:
【1】4和6比较,4小于6,不交换位置:1 2 3 4 6 5
【2】4和5比较,4小于5,不交换位置:1 2 3 4 6 5
第四趟总共进行了2次比较, 排序结果:1 2 3 4 6 5
----------------------
第五趟排序:
【1】6和5比较,6大于5,交换位置:1 2 3 4 5 6
第五趟总共进行了1次比较, 排序结果:1 2 3 4 5 6
----------------------
最终结果:1 2 3 4 5 6
代码实现如下
这个看上去感觉怎么样啊?这个代码还是很简单的,每一次通过前一个数和后面一堆数的比较,找出最小值。下面我们来试试一般人常用的冒泡排序法。那是什么呢?其实和上面的方法很相似,就是每次交换相邻的两个数,把大数放后面,通过不断的交换,直到这一次排列结束。
第一趟排序:
【1】4和2比较,4大于2,交换位置: 2 4 3 1 6 5
【2】4和3比较,4大于3,交换位置: 2 3 4 1 6 5
【3】4和1比较,4大于1,交换位置: 2 3 1 4 6 5
【4】4和6比较,4小于6,不交换位置:2 3 1 4 6 5
【5】6和5比较,6大于5,交换位置: 2 3 1 4 5 6
第一趟总共进行了5次比较, 排序结果: 2 3 1 4 5 6
----------------------
第二趟排序:
【1】2和3比较,2小于3,不交换位置:2 3 1 4 5 6
【2】3和1比较,3大于1,交换位置: 2 1 3 4 5 6
【3】3和4比较,3小于4,不交换位置:2 1 3 4 5 6
【4】4和5比较,4小于5,不交换位置:2 1 3 4 5 6
最后一个是上一轮选出的这些数中最大的数,不需要比较。所以第二趟总共进行了4次比较, 排序结果:2 1 3 4 5 6
----------------------
第三趟排序:
【1】2和1比较,2大于1,交换位置:1 2 3 4 5 6
【2】2和3比较,2小于3,不交换位置:1 2 3 4 5 6
【3】4和5比较,4小于5,不交换位置:1 2 3 4 5 6
第三趟总共进行了3次比较, 排序结果:1 2 3 4 5 6
----------------------
第四趟排序:
【1】1和2比较,1小于2,不交换位置:1 2 3 4 5 6
【2】2和3比较,2小于3,不交换位置:1 2 3 4 5 6
第四趟总共进行了2次比较, 排序结果:1 2 3 4 5 6
----------------------
第五趟排序:
【1】1和2比较,1小于2,交换位置:1 2 3 4 5 6
第五趟总共进行了1次比较, 排序结果:1 2 3 4 5 6
----------------------
最终结果:1 2 3 4 5 6
代码实现如下
这个也比较容易理解,在排序的过程中,外面的循环控制要对比多少趟,内部循环控制每一趟的比较。不过看了上面的比较过程是不是发现了一个问题,从第三趟开始,就已经得出最后的结果了,可是程序还在做比较,简直就是浪费时间,坏我青春.....不知道各位有没有什么办法优化一下,把这个无用功去掉啊~~
我们来看一下,是不是可以加一个标志,用来标记一下这些数字是否已经排序完成了,那么这个标记该怎么加入呢?加到哪里呢?快来开动你的小脑筋~
在比较完成以后,就不在进行数字的交换了,那么~你是不是想到了什么呢?
代码实现如下
不知道各位同学是否看懂上面的代码了呢?如果没看懂,你再好好想一想,如果看懂了,那么新问题又来了,如果在一开始,这串数字的后面就排好顺序了,为了不做无用功,那么此时又该怎么办呢?
提示下哦,此处应该注意的关键点是怎么记录已经排好顺序的元素和尚未排好顺序的元素的交叉点在什么位置。每一趟比较以后,这个点都会变化,这就需要一个变量,在每趟排序的时候,记录下来最新的那个点的位置。
代码如下所示
现在的你还觉得冒泡法很简单吗?最后的最后,推出一个黄金版冒泡。也就是网上比较流行的鸡尾酒排序,这个算法主要是,先从左到右用冒泡排序找到最大值放到最后一位;再从右到左使用冒泡排序找到最小的放到第一位,以此类推,持续的、依次的改变冒泡的方向,并不断缩小没有排序的数组范围。
代码实现如下
鸡尾酒排序和冒泡排序的时间复杂度和空间复杂度是相同的,只是在某些情况下前者会比后者好些。我做个一个小小的测试,测试上面各种算法,对随机产生的五万个数进行排序,花费的时间如下所示:
现在的你还觉得冒泡排序很简单吗?
三更编程菌
让我们一起学习吧
以上是关于冒泡排序花式玩法的主要内容,如果未能解决你的问题,请参考以下文章