实际中冒泡排序时间复杂度问题
给5,4,3,2,1做冒泡排序;因为此数列正好从大到小,所以冒泡排序所用的时间应该是最坏时间O(n^2) = 5^2 = 25 (意思应该是说比较25次吧)
第一趟下来:4,3,2,1,5 (次趟比较4次;5分别跟4,3,2,1比较)
第二趟下来:3,2,1,4,5 (次趟比较3次;4分别跟3,2,1比较)
第三趟下来:2,1,3,4,5 (次趟比较2次;3分别跟2,1比较)
第四趟下来:1,2,3,4,5 (次趟比较1次;2跟1比较)
按公式应该一共比较25次,但是实际只有10次(4+3+2+1=10),这个咋解释?
不吝赐教
谢谢回复
[解决办法]
时间复杂度说的是算法随着输入的增长,时间增长的速度。并不是让你用来精确计算算法次数的。
O(n^2)也就是假设输入按线性增长,算法所花的时间大致按照二阶函数增长。
输入:1:2:3
时间:1:4:9
这里讲的就是个比例而已,1可能代表1次运算,也可能代表10次运算。
[解决办法]
我还是把源代码写一下吧
25次是这样
int[] x = {5,4,3,2,1}; for (int i = 0; i < x.length; i++) { for (int j = 0; j < x.length-1; j++) { if(x[j] > x[j+1]){ int temp = x[j]; x[j] = x[j+1]; x[j+1] = temp; } } }
[解决办法]
时间复杂度,也就是你的那个O(n^2),这里表示的是渐近时间复杂度,也就是指当问题规模趋向无穷大时,该算法时间复杂度的数量级。注意,只是数量级,不是精确的值。
还有一个概念是精确的时间复杂度,指该算法所求解问题规模n的函数。如果是这样,那这个函数应该是f(n)=(n-1)n/2,在5个数的情况下f(n)=15。也就是最坏情况的比较次数。
f(n)=1/2n^2+1/2n。当n趋向无穷大是,n的数量级就是n^2。这也就是O(n^2)的由来。