python实例四:冒泡法对数列进行排序
当一组数据杂乱无章时,我们需要对其进行排序,比如列表[2,3,1],这个很好排列,当数量多的时候如[2,3,5,7,4,8,89,99,55,56,66]也可以,但是当数量达到100个时,即使能轻易看出谁最大谁最小,但是要把排序写出来也不是很容易的,所以想这种排序怎么吧,对于python来说,也不是什么难事,本文将讲述python中的冒泡法对数列进行排序,哪怕你要对几千个数据进行从大到小或从小到大的排序,那都是几行代码的事,结果也许就是几秒中的事。
先举个简单的数列,这样便于说明道理,比如数列N=[1,3,2,4,5,6],需要对其中的数字进行由大到小的排序,一般先从相邻的比较起,从第一个数起:
第一次比较:从左边数起,第一位数1与第二个位3比较,3>1,由于是要从大到小进行排列,所以大的就往左排,排序结果[3,1,2,4,5,6];
第二次比较:在第一位比较后的数列的基础上,将第二位数与第三位数比较,2>1,排序结果[3,2,1,4,5,6];
第三次比较:第三位数与第四位比较,4>1,排序结果为[3,2,4,1,5,6];
第四次比较:第四位数与第五位数比较,5>1,排序结果[3,2,4,5,1,6];
第五次比较:将第五位数与第六位数比较,6>1,排序结果[3,2,4,5,6,1];
从上面可以看出,经过第一轮从左到右相邻数的比较,最终将数列中最小的数排到了最右端,那么接下来呢,很简单,又从最左端开始,开始第二轮相邻比较,只不过这次,数列中的第6位由是已经是最小的,也就是说只有前面5个数比较,1个数就不再参与比较,经过4次比较后,数列排序结果为[3,4,5,6,2,1]。
然后再进行第三轮比较,也就是前4个数相比较,后2个数不参与比较,经过3次相邻比较后得到数列[4,5,6,3,2,1]。
然后再进行第四轮比较,也就是前3个数相比较,后3个数不参与比较,经过2次相邻比较后得到数列[5,6,4,3,2,1]。
再进行第五轮比较,也就是前2个数相比较,后4个数不参与比较,经过1次相邻比较后得到最终数列排序[6,5,4,3,2,1]。
总结表格如下所示:
m/轮数 | n/比较次数 | i/不参与数 | j/参与数 | len/总数 |
---|---|---|---|---|
1 | 5 | 0 | 6 | 6 |
2 | 4 | 1 | 5 | 6 |
3 | 3 | 2 | 4 | 6 |
4 | 2 | 3 | 3 | 6 |
5 | 1 | 4 | 2 | 6 |
以上表格可以得到等式:总数len=参与数j+不参与数i=轮数m+比较次数n
如果领会到了上述的原理,就会领会在python中实现的方法了,实现代码如下:
list1=[1,3,2,4,5,6] i=0 #i可理解为不参与数 list_len=len(list1) while i<list_len: j=2 #可理解为参与数 while j<=list_len-i: if list1[j-2]<list1[j-1]: c=list1[j-1] list1[j-1]=list1[j-2] list1[j-2]=c j+=1 i+=1 print(list1)
其实冒泡排序法难的不在于代码,代码很简单,而在于其中的原理,弄懂了原理,写起来就很简单了。上面一点代码运行结果如下:
在这个例子中如果不从参与数i和不参与数j角度考虑,而是从轮数m和次数n上理解,代码该如何呢?另外如果用自定义函数如何实现呢?