1. 程式人生 > >Python排序演算法(一)氣泡排序、選擇排序、插入排序

Python排序演算法(一)氣泡排序、選擇排序、插入排序

今天總結一下Python中的排序演算法。這篇文章有的排序演算法是:氣泡排序、選擇排序、插入排序

氣泡排序

先看一下程式碼。

'''
氣泡排序
'''

def bubble_sort(aList):
    n = len(aList)
    for i in range(0, n - 1):
        for j in range(0, n - i - 1):
            if aList[j] > aList[j + 1]:
                aList[j], aList[j + 1] = aList[j + 1], aList[j]

if __name__ == "__main__":
    li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
    print(li)
    bubble_sort(li)
    print(li)

氣泡排序的思路是:

1、比較相鄰的元素。如果第一個比第二個大(升序),就交換他們兩個。

2、對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。

3、針對所有的元素重複以上的步驟,除了最後一個。

過程分析:

我就不拿這個程式碼來分析了,我就說一下生活中是怎麼用到氣泡排序的,假設你們第一次上體育課,一般上體育課的時候,體育老師要的的事就是按照同學們的身高從低到高排序,想必這個場景大家都很熟悉。假設班上的n位同學此時已經站成一隊了,這個時候是沒有順序的,那麼這裡怎麼用到排序演算法來實現排序的呢。

1、首先體育老師先比較一下第一個同學(A)和第二個同學(B)的身高,可以看到A比B的身高要高,所以A和B換一下位置,然後,然後老師再比較第二個同學和第三個同學,依次這樣類推....等到所有同學比較一次,比較一次可以看到最後一位同學是我們所有同學中身高最高的,也就是說是列表裡面資料最大的。

2、我們找出最高的同學了,那麼老師就可以想,我下次在剩餘的同學中,再從第一位同學開始和相鄰的同學比較,我用同樣的方法也可以找到剩餘中身高最高的。

3、老師依次去迴圈第二步的操作,一直等到只有一位同學,並且那位同學是所有同學中最矮的,然後老師排序結束。

選擇排序

'''
選擇排序

選擇排序是每次找出最小的索引,
然後替換資料的位置

'''

def select_sort(aList):
    '''選擇排序'''
    l = len(aList)

    for j in range(l - 1):
        min_index = j
        for i in range(min_index + 1, l - 1):
            if aList[min_index] > aList[i]:
                min_index = i
        # 迴圈一遍後找到最小的索引
        aList[j], aList[min_index] = aList[min_index], aList[j]


if __name__ == "__main__":
    li = [9 , 16, 17, 15, 11]
    print(li)
    select_sort(li)
    print(li)

選擇排序的思路是:

1、首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,

2、再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。

我們還是拿老師排隊來舉例子。此時每位同學手裡都拿了一個號碼,假設從 0 ~ n ,

1、老師第一次要做的就是從這 n - 1 同學中找到最矮那位同學的編號,老師怎麼找呢?還是從頭開始兩個兩個相互比較等到從頭到尾比較相互比較一次後,老師知道誰身高最矮那位同學的編號(min_index)了。此時老師大喊一聲,min_index同學和第一位同學互換一下位置,連同手中的號碼牌也換一下。這個時候第一位同學就是全班中身高最矮的同學了,這個時候我們可以將全班同學看成兩部分一部分是有序的(假設一位同學也是有序的),另一部分是無序的也就是除第一個同學外其餘的同學。

2、老師從沒有順序中的同學中再重複找到身高最矮同學的編號,放到有序佇列的末尾,依次這樣類推,就把所有同學的身高有了個排序。

我們看出選擇排序的主要思想是從無序佇列中找出值最小的資料的編號,然後放到有佇列中,只不過是這個有序佇列一直在擴充,無序佇列一直在減少。

插入排序

'''
插入排序
'''
def insert_sort(aList):
    '''插入排序'''
    n = len(aList)
    for i in range(n):
        j = i
        # print('j= ', j)
        while j > 0:
            if aList[j] < aList[j - 1]:
                aList[j], aList[j - 1] = aList[j - 1], aList[j]
            # print(j)
            j -= 1
        # print(' ')


if __name__ == "__main__":
    li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
    print(li)
    insert_sort(li)
    print(li)

插入排序的思路:

1、插入排序可以這樣看待,是將資料序列分成兩部分,前面一部分是有序的,後面一部分是無序的。

2、怎麼將將無序的變成有序的呢,我們舉個例子,還是上面老師排隊的例子。

首先從第一位同學開始,然後第一位和第二位比較然後排序,此時這兩位同學是有序的了,

然後我們再從從無序的佇列中取出一位同學,也就是第三位,將第三位和第二位比較,然後他們中矮的同學再和第一位比較,此時這三位同學是有序的,

然後再取出第四位同學,然前面的比較.....,一直到最後一位同學比較。