在前面我们实现了选择排序与冒泡排序的具体实现,现在我们从数学的角度分析下算法的效率问题:
首先我们把两种排序算法的概念重温一遍:
选择排序:在每一轮中,找出最小的元素放在他最终的位置。挺起来有些别扭,我们举个实例:
eg: 8, 5,1, 20, 6, 3
1ed······ 1, 5,8, 20, 6, 3
2ed······ 1, 3, 8,20, 6,5
3ed······ 1, 3,5, 20, 6, 8
4ed······ 1, 3, 5, 6, 20,8
5ed······ 1, 3, 5, 6, 8,20
这样一看应该就比较清楚了,那么在每次循环中比较是主要的操作,所以我们就把比较作为该算法分析的一个点,接下来我们从数学的角度分析:
在算法分析中有几个重要的公式:
在选择排序中:
for(i=0;i--->n-1) { min=i; for(j=i+1;j---->n){ if array[j]<array[min] min=j; } swap(array[min],array[i]); }由上面我们可以得出数学公式:
这样我们就可以粗略的计算该算法的时间复杂度。通过这样的结果我们就可以衡量不同的算法在特定的条件下,哪个效率会更高。其实下面的冒泡排序算法的时间复杂度跟上面的选择排序是一种类型的,所以下面我只大概的说明下:
冒泡排序:
关于冒泡排序,这个名字其实比较有意思,记得小时候经常向小水渠丢石头,每次我们丢入一块石头的时候,你会发现都会有一个水泡冒出来,这样联想起来,这个算法就更加容易理解了;通俗的话来讲就是,在每一轮的比较中,都会有一个最大的元素沉下去。下面我们一起看看伪代码:
for(i=0;i<array.length-1){ for(j=0;j<array.length-i-1){ if(array[j]>array[j+1]) swap(a[j][j+1]) } }
经过同样的步骤我们可以得到相同的结果就是n^2型,而这两种算法都属于蛮力算法,相对比较简单,有难度的等小弟再修炼一段时间与大家分享,有问题的欢迎一起学习讨论。
博主励志:
你无法改变的事情,就请默默的接受吧,否则伤心,伤脑,伤身...
原文地址:http://blog.csdn.net/toplifeww/article/details/43408573