冒泡排序的基本原理就是第一个与第二个比,将大的放在后面;第二个和第三个比,大的放后面,一直到最后一个元素与前面的比。过程如下:
我们发现这一趟下来最大的数字已经在最后面了,那么我们将这个过程多次循环,就可以逐步挑选最大的数字到最后。因为每次将最大的数找到了,就可以缩小这个范围一直到最后一个:
代码写出来就是这样,一般写成函数:
冒泡排序的优化:
我们可以看到上面图例,整个排序到倒数第四步就已经排好序,这里就可以提前结束循环:
这里我们就可以用一个值进行检测,看交换的动作是否在一个循环里面进行,如果一个内部循环完了没有交换,那么p不会赋值为0,就会在在这次循环结束跳出外部循环,提高效率。
另外:
我们还有其他的优化空间,我们在从左往右找到最大值的同时也可以从右往左把最小值找到:
这里我们可以再用一个if控制从右往左来寻找最小的
测试:
那么我们为了更加清楚的感受这三种版本冒泡排序的效率,我们借助clock并用多个数据来测试:
在这里用了动态数组和产生随机值来创造一个乱序数组,然后再用clock函数记录每个版本排序的时间:(这里忘记free三个数组了,但是结果没有影响 )
先考虑数据多的情况,以10 0000为例:
70000 为例:
50000为例:
20000为例:
10000:
5000:
出乎我们意料,第一次优化是负优化,因为提前结束的排序情况很少,但是一系列逻辑操作,变量赋值会消耗一定时间,前者减少的情况少,导致时间反而延长了。但是第二次优化是可以的,多少优化了一些。如果是平常小数据的排序直接最初的就行,第二次优化也没有多大的增益。所以我只能说快排是最快的!
祝大家龙年大吉,点点赞