排序演算法不會???來用Python學,賊簡單

2021-10-06 08:02:42 字數 4060 閱讀 3835

氣泡排序

冒泡冒泡,是將石頭丟下去,才會有個泡泡冒起來,顧名思義,我們建立乙個for迴圈,從後往前遍歷,這樣就實現了每次遍歷都會剔除掉最後乙個元素的操作,這恰好是我們所需要的(因為氣泡排序的內迴圈就是將最大元素移動到最後的位置)

在內迴圈中,我們從頭開始遍歷,每一次都會比較當前點和下乙個點比較,滿足條件就交換,一直迴圈下去,這樣就會在一輪迴圈中將乙個最大的元素移動到最後,此時我們執行外迴圈,進行新一輪的大元素的後移操作。

# -*- conding:utf-8 -*-

def bubble_sort(lists):

'''氣泡排序'''

for i in range(len(lists)-1, 0, -1):

# 每次迴圈會得到最大的,使用range(len(lists)-1, 0, -1),則是模擬剪掉最大元素位置

for j in range(i):

# 按照順序開始進行比較,將最大元素移送到最後

if lists[j] > lists[j+1]:

lists[j], lists[j+1] = lists[j+1], lists[j]

return lists

選擇排序

選著排序中假設for迴圈為游標移動,就相當於兩個快慢性格的人,慢游標移動一格,快游標則是在當前漫遊標的位置開始向右移動,一直到末尾;此時漫遊標再右移動一格,快游標再次重複上述操作。

在快游標移動過程中,它需要做比較操作,若是比漫游標位置處的 元素要小,則記錄一下,然後再右移,若是再遇到乙個元素比在途中遇到的還小,則重新記錄一下,最終快游標一一迴圈走完,跳出迴圈時,需要做一下小小的判斷,若是記錄的最小元素的索引比初始的要小,則交換一下位置,否則不做操作。

# -*- conding:utf-8 -*-

def select_sort(lists):

'''選擇排序'''

for i in range(len(lists)-1):

# 建立起始下標開始遍歷,利用range的特性,依次開始遍歷每乙個下標

min_index = i

for j in range(i+1, len(lists)):

# 針對元素進行遍歷,與第乙個元素相比較,將最小元素索引保留並返回

if lists[j] < lists[min_index]:

min_index = j

if min_index != i:

# 判斷最小索引是否應該在合適位置,不在,則進行交換

lists[i], lists[min_index] = lists[min_index], lists[i]

return lists

插入排序

相當於建立兩個游標,第乙個游標一直向前走,不回頭的那種,而第二個游標則是獲取第乙個游標的位置之後往回走。

當第乙個游標向右移動一格,此時我們就開始將當前游標下的元素和前乙個元素比較,在相應條件(小於或者大於)下進行交換操作,一直到第二個游標完全逆向遍歷完,跳出迴圈,此時第乙個游標向右再走一格,然後第二個游標往回走…

這裡說乙個小技巧,就是第二個游標在往回遍歷時,若是已經遍歷到超出我們設定的條件時,可以做break操作,原因是之前的數其實就是公升序或者降序,效果就是可以節省時間。

# -*- conding:utf-8 -*-

def insert_sort(lists):

'''插入排序'''

for i in range(len(lists)-1):

for j in range(i+1, 0, -1):

if lists[j] < lists[j-1]:

lists[j], lists[j-1] = lists[j-1], lists[j]

else:

break

return lists

快速排序

從數列中挑選乙個元素,我們稱之為「基準」(這裡我們選擇最後乙個元素),然後建立兩個游標,分別在數列頭部和數列尾部-1的位置,前游標向後移動(保證游標大小不可以大於後游標),遇到的元素大於尾部元素,則暫停!此時後游標向前移動(保證游標大小不可以小於前游標),遇到的元素小於尾部元素則暫停,然後交換兩個游標指向的元素;然後再去處理游標的移動,若是前游標小於後游標,這繼續移動,一直到兩個游標重合,此時和最後的元素相比較,然後交換。此時就會實現乙個數列的分割,變為左右兩個部分,使用遞迴的方法對餘下部分進行處理即可。

# -*- coding:utf-8 -*-

def quick_sort(lists,left,right):

'''快速排序'''

# 遞迴結束條件

if left > right:

return

base_num = lists[right]

start = left

end = right

while start < end:

# 前游標

while start < end and lists[start] <= base_num:

start += 1

# 後游標

while start < end and lists[end] >= base_num:

end -= 1

# 交換游標指向的元素

lists[start], lists[end] = lists[end], lists[start]

# 若是游標指向同一元素位址,則講該元素和最後面的乙個元素

if start == end:

lists[end], lists[right] = lists[right], lists[end]

# 左邊遞迴

quick_sort(lists, left, start-1)

# 右邊遞迴

quick_sort(lists, start+1, right)

希爾排序

可以簡單理解為插入排序的變種,是將整個有序序列分割成若干小的子串行分別進行插入排序。

# -*- coding:utf-8 -*-

def shell_sort(lists):

'''希爾排序'''

sublistcount = len(lists) // 2

while sublistcount > 0:

for i in range(sublistcount):

gap_insert_sort(lists, i, sublistcount)

sublistcount //= 2

return lists

def gap_insert_sort(lists,start,gap):

for i in range(start,len(lists)-1, gap):

for j in range(i+1,0,-gap):

if lists[j] < lists[j-gap]:

lists[j], lists[j-gap] = lists[j-gap], lists[j]

else:

break

歸併排序

歸併排序是將原數列分成若干個小份,對每小份進行排序,然後合併的過程。

# -*- coding:utf-8 -*-

def merge_sort(lists):

'''歸併排序'''

if len(lists) <= 1:

return lists

# 使用遞迴的方式進行切分,並講切分的資料進行排序後合併

middle = len(lists) // 2

left = merge_sort(lists[:middle])

right = merge_sort(lists[middle:])

merged =

while left and right:

if left[0] < right[0]:

else:

merged.extend(right if right else left)

return merged

最近都會來學一點Python

開啟電腦,發現python都是之前的 將近一年之前的時間。最近都會重新掌握起來,從基礎到乙個測試框架,預計是在乙個月之內。想想去年9月之後,做了什麼,做了乙個簡單的測試平台,主要功能是crud,還有基於平時測試,得出的一點結論,做了乙個簡單的異常測試用例自動生成。對boss直聘的某個職位進行抓取 i...

什麼?學Python你竟然不會virtualenv

博主為mac下玩python,windows略有差別 通過pip安裝virtualenv pip install virtualenv版本檢視 virtualenv version為乙個工程專案搭建乙個虛擬環境 cd demo project virtualenv demo env 或者可以選擇指定...

演算法不會,尚能飯否之排序 直接選擇排序

前面講了那麼多的排序,不知道有沒有人看,如果有人看,就吱一聲,也好讓我有信心在寫下去了!不管了,還是那句話,寫自己的博文,讓別人說去吧,現在應該是,寫自己的博文,讓別人看去吧!看不 看,是你的事,寫不寫是我的事!好了,廢話少說,開始今天的征程 直接選擇排序!演算法思想 所謂直接選擇排序,如下 1 在...