3、one_turn
4、two_turn
5、three_turn
6、four_turn
7、five_turn
8、six_turn10101010101049999941088884997774888664777754666664555555通过上图可以看出,冒泡法形象的描述来,4这个元素就像一个气泡逐渐冒到上面来了。我们排序的有7个元素,最坏的情况全
9、部倒序,4这个元素要冒上来需要6次。因此,n个元素,最坏的情况,需要移动:1+2+3+...+(n-1)=1/2*n(n-1)次。倒序(最糟情况)第一轮:10,9,8,7->10,9,7,8->10,7,9,8->7,10,9,8(交换3次)第二轮:7,10,9,8->7,10,8,9->7,8,10,9(交换2次)第一轮:7,8,10,9->7,8,9,10(交换1次)循环次数:6次交换次数:6次其他:第一轮:8,10,7,9->8,10,7,9->8,7,10,9->7,8,10,9(交换2次)第二轮:7,8,10,9->7
10、,8,10,9->7,8,10,9(交换0次)第一轮:7,8,10,9->7,8,9,10(交换1次)循环次数:6次交换次数:3次上面我们给出了程序段,现在我们分析它:这里,影响我们算法性能的主要部分是循环和交换,显然,次数越多,性能就越差。从上面的程序我们可以看出循环的次数是固定的,为1+2+...+n-1。写成公式就是1/2*(n-1)*n。现在注意,我们给出O方法的定义:若存在一常量K和起点n0,使当n>=n0时,有f(n)<=K*g(n),则f(n)=O(g(n))。(呵呵,不要说没学好数学呀,对于编程数学是非常重要的!
11、!!)现在我们来看1/2*(n-1)*n,当K=1/2,n0=1,g(n)=n*n时,1/2*(n-1)*n<=1/2*n*n=K*g(n)。所以f(n)=O(g(n))=O(n*n)。所以我们程序循环的复杂度为O(n*n)。再看交换。从程序后面所跟的表可以看到,两种情况的循环相同,交换不同。其实交换本身同数据源的有序程度有极大的关系,当数据处于倒序的情况时,交换次数同循环一样(每次循环判断都会交换),复杂度为O(n*n)。当数据为正序,将不会有交换。复杂度为O(0)。乱序时处于中间状态。正是由于这样的原因,我们通常都是通过循环
12、次数来对比算法。2.交换法:交换法的程序最清晰简单,每次用当前的元素一一的同其后的元素比较并交换。#includevoidExchangeSort(int*pData,intCount){intiTemp;for(inti=0;i13、,8,7,6,5,4};ExchangeSort(data,7);for(inti=0;i<7;i++)cout<14、one_turn
15、two_turn
16、three_turn
17、four_turn
18、five_turn
19、six_turn10987654910101010101088999997778888666677755555664444445从上面的算法来看,基本和冒泡法的效率一样。倒序(最糟情况)第一轮:10,9,8,7->9,10,8,7->8,10
20、,9,7->7,10,9,8(交换3次)第二轮:7,10,9,8->7,9,10,8->7,8,10,9(交换2次)第一轮:7,8,10,9->7,8,9,10(交换1次)循环次数:6次交换次数:6次其他:第一轮:8,10,7,9->8,10,7,9->7,10