一直以來,對於排序都是比較零散的去學習和了解,用到什麼就去查什麼,本次決定把集中排序彙總記錄下。(使用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...