氣泡排序
冒泡冒泡,是將石頭丟下去,才會有個泡泡冒起來,顧名思義,我們建立乙個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 在...