算法之冒泡排序

来源:互联网 发布:数据保险箱 编辑:程序博客网 时间:2024/06/07 16:20

今天我们要讲的是冒泡排序,打算把算法的内容都写成博客的形式。


冒泡排序(Bubble Sort):

它是一种较简单的排序算法。它会遍历若干次要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小;如果前者比后者大,则交换它们的位置。这样,一次遍历之后,最大的元素就在数列的末尾! 采用相同的方法再次遍历时,第二大的元素就被排列在最大元素之前。重复此操作,直到整个数列都有序为止。


python 代码

def bubbleSort(alist):    for passnum in range(len(alist)-1,0,-1):        for i in range(passnum):            if alist[i]>alist[i+1]:                temp = alist[i]                alist[i] = alist[i+1]                alist[i+1] = tempalist = [54,26,93,17,77,31,44,55,20]bubbleSort(alist)print(alist)

输出:

[17, 20, 26, 31, 44, 54, 55, 77, 93]

这样就是最好的代码了吗?有没有考虑过如果从一开始就是排好序的或者在中间某次排完序之后整个数列就已经有序了呢?

来看一下下面的代码:

def shortBubbleSort(alist):    exchanges = True    passnum = len(alist)-1    while passnum > 0 and exchanges:       exchanges = False       for i in range(passnum):           if alist[i]>alist[i+1]:               exchanges = True               temp = alist[i]               alist[i] = alist[i+1]               alist[i+1] = temp       passnum = passnum-1alist=[20,30,40,90,50,60,70,80,100,110]shortBubbleSort(alist)print(alist)

代码解释:

循环的一开始就设置 exchanges = False,如果有进行交换的话,就会设置为 exchanges = True。如果在某一次循环中,都没有进行交换的话,则不会在进行循环了。


输出:

[20, 30, 40, 50, 60, 70, 80, 90, 100, 110]

时间复杂度:

冒泡排序的时间复杂度是O(N2)
假设被排序的数列中有N个数。遍历一趟的时间复杂度是O(N),需要遍历多少次呢?N-1次!因此,冒泡排序的时间复杂度是O(N2)。


参考资料:

(1)http://interactivepython.org/courselib/static/pythonds/SortSearch/TheBubbleSort.html(也可以提高英文水平)

原创粉丝点击