python實現常用排序

2022-07-31 14:39:12 字數 2930 閱讀 9276

一直以來,對於排序都是比較零散的去學習和了解,用到什麼就去查什麼,本次決定把集中排序彙總記錄下。(使用python是覺得語法更加靈活,可以省很多**說明,還可驗證結果)

首先,我們最先接觸到也是最好理解的排序--氣泡排序

氣泡排序就是迴圈取元素,然後往後比較,如果大於後面元素則交換位置,直到比較到最後乙個,重複操作,直到所有元素都比較完成,即得到排序結果

**實現也比較簡單,主要如下:

oldarr = [3, 4, 6, 2, 1, 4, 9, 10]
# 氣泡排序

def bubble_sort(arr):

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

for j in range(len(arr) - 1 - i):

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

arr[j], arr[j + 1] = arr[j + 1], arr[j]

return arr

print(bubble_sort(oldarr))

氣泡排序很簡單,就是遍歷比較大小互動位置即可

選擇排序

核心思想是,從頭至尾掃瞄序列,找出最小的乙個元素,和第乙個元素交換,接著從剩下的元素中繼續這種選擇和交換方式,最終得到乙個有序序列

def select_sort(arr):

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

min_index = i

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

if arr[j] < arr[min_index]:

min_index = j

# 最小元素與起始元素調換位置

arr[min_index], arr[i] = arr[i], arr[min_index]

return arr

插入排序

# 從第二個元素開始和前面的元素進行比較,如果前面的元素比當前元素大,則將前面元素 後移,當前元素依次往前,直到找到比它小或等於它的元素插入在其後面

# 然後選擇第三個元素,重複上述操作,進行插入

# 依次選擇到最後乙個元素,插入後即完成所有排序

def insert_sort(arr):

for i in range(len(arr)):

# 插入元素

current = arr[i]

# 比較元素

pre_index = i - 1

while pre_index >= 0 and arr[pre_index] > current:

arr[pre_index + 1] = arr[pre_index]

pre_index -= 1

arr[pre_index + 1] = current

return arr

希爾排序

先取乙個小於n的整數d1作為第乙個增量,把檔案的全部記錄分組。所有距離為d1的倍數的記錄放在同乙個組中。先在各組內進行直接插入排序;然後,取第二個增量d2 0:

for i in range(gap, len(arr)):

j = i

current = arr[i]

while j - gap >= 0 and current < arr[j - gap]:

arr[j] = arr[j - gap]

j -= gap

arr[j] = current

gap //= 2

return arr

歸併排序

是採用分治法的乙個非常典型的應用。歸併排序的思想就是先遞迴分解陣列,再合併陣列

def quick_sort(arr):

if len(arr) < 2:

return arr

base = arr[0]

less = [i for i in arr[1:] if i < base]

greater = [i for i in arr[1:] if i >= base]

return quick_sort(less) + [base] + quick_sort(greater)

堆排序

def heap_sort(arr):

n = len(arr)

first = int(n / 2 - 1) # 最後乙個非葉子節點

for start in range(first, -1, -1): # 構造大根堆

max_heapify(arr, start, n - 1)

for end in range(n - 1, 0, -1): # 堆排,將大根堆轉換成有序陣列

arr[end], arr[0] = arr[0], arr[end]

max_heapify(arr, 0, end - 1)

return arr

# 最大堆調整:將堆的末端子節點作調整,使得子節點永遠小於父節點

# start為當前需要調整最大堆的位置,end為調整邊界

def max_heapify(ary, start, end):

root = start

while true:

child = root * 2 + 1 # 調整節點的子節點

if child > end:

break

if child + 1 <= end and ary[child] < ary[child + 1]:

child = child + 1 # 取較大的子節點

if ary[root] < ary[child]: # 較大的子節點成為父節點

ary[root], ary[child] = ary[child], ary[root] # 交換

root = child

else:

break

效率比較:冒泡=插入=選擇=o(n2) 希爾=歸併=快速=堆=o(nlog n)

python實現常用排序演算法

半夜醒來,閒來無事,寫寫排序演算法,興之所致,未來得及debug,有問題自己解決。coding utf 8 created on tue may 19 00 52 47 2015 氣泡排序 插入排序 1 每一步就像在一首已經排序的撲克牌中再插入一張牌,這張牌標記為value 2 從最後一張開始比較,...

常用排序演算法的Python實現

排序演算法穩定性的簡單形式化定義為 如果ai aj,排序前ai在aj之前,排序後ai還在aj之前,則稱這種排序演算法是穩定的。通俗地講就是保證排序前後兩個相等的數的相對順序不變。對於不穩定的排序演算法,只要舉出乙個例項,即可說明它的不穩定性 而對於穩定的排序演算法,必須對演算法進行分析從而得到穩定的...

7種常用排序演算法(python實現)

本節為手撕 系列之第一彈,主要來手撕排序演算法,主要包括以下幾大排序演算法 演算法思想 每一步將乙個待排序的記錄,插入到前面已經排好序的有序序列中去,直到插完所有元素為止。實現 直接插入排序 def insert sort arr length len arr for i in range leng...