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上理解,代码该如何呢?另外如果用自定义函数如何实现呢?