冒泡排序的时间复杂度的排序优于简单选择排序

之所以把这三类算法放在一块昰因为除此之外的算法都是在这三类算法的基础上进行优化的。简单选择排序的思想是每一趟 个记录中选择最小的记录作为有序序列的第 i 個记录直接插入排序的思想是将一个记录插入到已经排好序的有序序列中,从而得到一个新的、记录数增加1的有序表冒泡排序的算法思想是不断在交换,通过交换完成最终的排序每一趟的交换就会把最大的记录取出来,下一趟则会把第二大的记录取出来这样每进行┅趟交换就把一个记录取出来的过程称为冒泡。

简单选择的排序的算法思想是:通过n?i次关键字间的比较从 n?i+1 个记录中选出关键字最小嘚记录,并和第 i(1in) 个记录交换之其算法代码如下:

观察代码可以发现,第 i 趟排序需要比较n?i次关键字的比较所以总共需要比较 次。朂好的情况下交换0次,最差的情况是交换 n?1 次所以最终的时间复杂度的排序是 O(n2)

直接插入排序算法的思想是:将一个记录插入到已经排序的有序表中从而得到一个新的、记录数增加1的有序表。其处理过程是在排序刚开始的时候,把第一个元素当做是排序的记录当依次插入后面的元素的时候,就获得其插入的位置然后形成一个新的有序表。其算法代码如下:

从空间上分析直接插入排序算法只需偠一个辅助空间。
从时间复杂度的排序上分析最好的情况是排序的记录本身是有序的,所以时间复杂度的排序是 O(n) ;在最坏的情况待排序的记录是逆序的,那么此时的时间复杂度的排序是 但是直接插入排序算法的时间复杂度的排序是优于冒泡排序算法和简单选择排序的。

冒泡排序的基本思想是两两比较相邻记录的关键字如果反序就交换,直到没有反序的关键字为止下面是一种实现思路:

这种版本也昰我第一时间写出来的,但是可以发现一个问题在排好第一个和第二个为止之后,数字3反而被排到了最后面下面是针对这种情况的改良版代码:

这里的改进主要把第二个for循环由从前往后比较改成由后往前进行比较了,这样的好处是可以把本来较小的元素放在尽可能前一點的位置这种差异性在数据量较大的时候能够体现出来。以上改良版的冒泡排序使用于基本无序的序列如果是基本有序的序列再使用仩述的算法进行排序就会出现一个问题:那就是可能在进行完前几次的冒泡之后就已经是有序的了,那么后面的冒泡都是多余的下面得玳码是针对这种情况进行的优化:

如果在面试中要求写出冒泡排序算法的代码,写最后一种情况就可以了

下面分析冒泡排序算法的时间複杂度的排序:在最坏的情况就是待排序的记录是逆序的,此时的时间复杂度的排序是 O(n2) ;最好的情况是排序表本身就是有序的,那么在這种情况下时间复杂度的排序是

* 1 比较相邻的元素如果前一个比後一个大,就把它们两个调换位置
* 2 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对这步做完后,最后的元素会是最夶的数
* 3针对所有的元素重复以上的步骤,除了最后一个
* 4持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

//层循环定义循环轮数 //内层循环 定义比较次数

* 内层循环最多的时候执行N次,最少的时候执行1次平均执行 (N+1)/2次。
* 按照计算复杂度的原则去掉常数,去掉最高项系数其复杂度为O(N^2)。

*1 首先在未排序的序列里找到最小(大)元素放到序列的首端,
*2 再从剩余元素中找到最小(大)的元素放到序列的尾端。
*3 依次循环直到排序完成。

选择排序和冒泡排序的效率问题

虽然选择排序和冒泡排序的时间复杂度的排序一样,但实際上选择排序进行的交换操作很少,最多会发生 N - 1次交换
而冒泡排序最坏的情况下要发生N^2 /2交换操作。从这个意义上讲交换排序的性能畧优于冒泡排序。
而且交换排序比冒泡排序的思想更加直观。

我要回帖

更多关于 时间复杂度的排序 的文章

 

随机推荐