冒泡排序最佳情况的时间复杂度,为什么是O(n)
2012-09-20 11:23
176 查看
我在许多书本上看到冒泡排序的最佳时间复杂度是O(n),即是在序列本来就是正序的情况下。
但我一直不明白这是怎么算出来的,因此通过阅读《算法导论-第2版》的2.2节,使用对插入排序最佳时间复杂度推算的方法,来计算冒泡排序的复杂度。
1. 《算法导论》2.2中对插入排序最佳时间复杂度的推算
![](http://pic002.cnblogs.com/images/2012/445785/2012092011035910.png)
在最好情况下,6和7总不被执行,5每次只被执行1次。因此,
![](http://pic002.cnblogs.com/images/2012/445785/2012092011053188.png)
时间复杂度为O(n)
2. 冒泡排序的时间复杂度
2.1 排序代码
2.2 最佳情况
序列原本就是正序
2.3 最佳情况时间复杂度推算
T(n) = c1 + c2n + c3(n - 1) + c4(n - 1) + c5[t1(i=0) + t1(i=1) + ... + t1(i = n-2)] + c6[t2(i=0) + t2(i=1) + ... + t2(i = n-2)] + c7[t3(i=0) + t3(i=1) + ... + t3(i = n-2)] + c8[t4(i=0) + t4(i=1) + ... + t4(i = n-2)];
当序列原本就是正序时,8从不被执行。因此
T(n) = c1 + c2n + c3(n - 1) + c4(n - 1) + c5[t1(i=0) + t1(i=1) + ... + t1(i = n-2)] + c6[t2(i=0) + t2(i=1) + ... + t2(i = n-2)] + c7[t3(i=0) + t3(i=1) + ... + t3(i = n-2)];
此时的时间复杂度应为O(n^2)。
可是网上和许多书上都写道是O(n),不知是否有人能帮我解答一下呢?
2.4 在Stackoverflow上问到答案了。
我原本的代码的时间复杂度确实应该是O(n^2),但算法可以改进,使最佳情况时为O(n)。改进后的代码为:
但我一直不明白这是怎么算出来的,因此通过阅读《算法导论-第2版》的2.2节,使用对插入排序最佳时间复杂度推算的方法,来计算冒泡排序的复杂度。
1. 《算法导论》2.2中对插入排序最佳时间复杂度的推算
![](http://pic002.cnblogs.com/images/2012/445785/2012092011035910.png)
在最好情况下,6和7总不被执行,5每次只被执行1次。因此,
![](http://pic002.cnblogs.com/images/2012/445785/2012092011053188.png)
时间复杂度为O(n)
2. 冒泡排序的时间复杂度
2.1 排序代码
public void bubbleSort(int arr[]) { for(int i = 0, len = arr.length; i < len - 1; i++) { for(int j = 0; j < len - i - 1; j++) { if(arr[j + 1] < arr[j]) swap(arr, j, j + 1); } } }
2.2 最佳情况
序列原本就是正序
2.3 最佳情况时间复杂度推算
语句 | cost | times |
i = 0, len = arr.length | c1 | 1 |
i < len - 1 | c2 | n |
i++ | c3 | n - 1 |
j = 0 | c4 | n - 1 |
j < len - i - 1 | c5 | t(i=0) + t(i=1) + ... + t(i = n-2) |
j++ | c6 | t2(i=0) + t2(i=1) + ... + t2(i = n-2) |
arr[j + 1] < arr[j] | c7 | t3(i=0) + t3(i=1) + ... + t3(i = n-2) |
swap(arr, j, j + 1) | c8 | t4(i=0) + t4(i=1) + ... + t4(i = n-2) |
当序列原本就是正序时,8从不被执行。因此
T(n) = c1 + c2n + c3(n - 1) + c4(n - 1) + c5[t1(i=0) + t1(i=1) + ... + t1(i = n-2)] + c6[t2(i=0) + t2(i=1) + ... + t2(i = n-2)] + c7[t3(i=0) + t3(i=1) + ... + t3(i = n-2)];
此时的时间复杂度应为O(n^2)。
可是网上和许多书上都写道是O(n),不知是否有人能帮我解答一下呢?
2.4 在Stackoverflow上问到答案了。
我原本的代码的时间复杂度确实应该是O(n^2),但算法可以改进,使最佳情况时为O(n)。改进后的代码为:
public void bubbleSort(int arr[]) { boolean didSwap; for(int i = 0, len = arr.length; i < len - 1; i++) { didSwap = false; for(int j = 0; j < len - i - 1; j++) { if(arr[j + 1] < arr[j]) { swap(arr, j, j + 1); didSwap = true; } } if(didSwap == false) return; } }
相关文章推荐
- 冒泡排序最佳情况的时间复杂度,为什么是O(n)
- 冒泡排序最佳情况的时间复杂度,为什么是O(n)
- 冒泡排序最佳情况的时间复杂度,为什么是O(n)
- 冒泡法的算法最佳情况下的时间复杂度为什么是O(n)
- 冒泡排序的最佳情况的时间复杂度为什么是O(n)
- 为什么冒泡排序最好情况下(有序)时间复杂度是O(n),而快速选择是O(O^2)?
- 冒泡排序最好时间复杂度为什么是O(n)?
- 冒泡排序法为什么最佳的时间复杂度是O(n)
- 快速排序算法在平均情况下的时间复杂度为 求详解
- 最怀情况下的时间复杂度
- 关于中位数的时间复杂度为什么是O(n)
- 你可能不知道位图,但是它真的很有用,特殊情况可以使时间复杂度降低不是一两个档次那么简单...
- 最坏情况下保证时间复杂度为N*logN的快速排序
- 快速排序算法的时间复杂度为什么是O(NlogN),还有O(N^2)
- 为什么辗转除法求最大公因子的时间复杂度是O(nn)
- 2011-11-16 ( 从KMP算法体现的思想 和 快排平均时间复杂度为什么是O(nlgn) )
- 【算法面试】n个数,找出其中最小的k个数,写出代码,要求最坏情况下的时间复杂度不能高于O(nlogk)
- 为什么红黑树的时间复杂度为lgn——渐进边界的证明
- 排序算法之 冒泡排序 及其时间复杂度和空间复杂度
- java HashMap在不发生冲突的情况下get(key)时间复杂度是o(1)