冒泡排序

来源:互联网 发布:园林设计手机教学软件 编辑:程序博客网 时间:2024/05/22 20:29
冒泡排序就如他的名字,每次都有泡泡浮上来,泡泡自然是最轻的,最小的,一次遍历数列侯最小的会交换到第一位(下标为1,下标0为哨兵位)。
 其实也可以相反的来,每次遍历有最大的交换到最后一位,沉底法,就如石头沉到底一样。
我用的就是沉底。
用数组来举例,先是外层循环,设置i从1到 len-1,每次i++,从1开始因为0号下标为哨兵我们不管。
至于为什么是len-1呢。因为我们知道每次循环会有一个数上浮(或者下沉)到一个位置,当倒数第二个待排数到达指定位置后,最后一个待排数字的位置也就确定。
代码




关于优化:
冒泡排序的优化是这样的,每次内循环都是前后两者比较,如果出现了反序的情况就交换,但如果一遍遍历下来没有反序发生呢,那就代表数列已经有序了,所以我们可以加个标致flag,初始为false;如果有反序发生,进入了交换那块的代码,我们就把flag变为true,内循环结束后判断下flag。如果为true,那么什么也不做,直接下一次循环,如果依旧为flase,就代表那次内循环从头到尾都没进入过交换代码块 ,整个数列不存在反序!那么我们的目的就已经达到了,直接跳出外循环,结束函数,打完收工!!
优化代码如下:


但是这种优化只对于那种基本有序的数列有用处,对于很乱序的数列来说几乎没什么优化,还会增加逻辑判断。
所以说不实用,但苍蝇腿也是肉,吃不吃看需求了。
以下是不优化1万个随机数据和排序花费的时间:


以下是优化后1万个随机数据和排序花费的时间:


可以看出时间反而还多了,因为其实两次随机数的排列都一样的,但优化增加的逻辑判断时间要比优化节省的时间还多,所以说有时苍蝇腿也不能吃,万一脏了感染病也是问题。
最后试了试10万个随机数据:



漫长的81秒啊,可以看出冒泡的时间复杂度是很差的。


平均为0(n^2)  最好为O(n) 最坏(n^2)

稳定性:是稳定的,因为没有发生过跳跃式的位置交换,大家都很按照规则的前后比,如果一样也不会乱插队,真好!

原创粉丝点击