隨時要手撕的七種排序演算法
# 1. 快排
def qsort(arr):
def sort(arr, start, end):
if start >= end: return
i, j = start, end
key = arr[start]
while i < j:
# 從右邊找起
while i < j and arr[j] >= key: j -= 1
arr[i] = arr[j]
while i < j and arr[i] <= key: i += 1
arr[j] = arr[i]
arr[i] = key
sort(arr, start, i - 1)
sort(arr, i + 1, end)
sort(arr, 0, len(arr) - 1)
return arr
# 2. 堆排序
def hsort(arr):
def heapadjust(arr, start, end):
dad, son = start, 2 * start + 1
while son <= end:
if son + 1 <= end and arr[son] < arr[son + 1]: son += 1
if arr[dad] < arr[son]: arr[dad], arr[son] = arr[son], arr[dad]
dad, son = son, 2 * son + 1
for i in range(len(arr) // 2 - 1, -1, -1):
heapadjust(arr, i, len(arr) - 1) # 從最右下的父節點開始
for i in range(len(arr) - 1, -1, -1):
arr[0], arr[i] = arr[i], arr[0]
heapadjust(arr, 0, i - 1) # 剩餘的n-1個
return arr
# 3. 冒泡
def bsort(arr):
for i in range(len(arr)):
for j in range(1, len(arr) - i):
if arr[j - 1] > arr[j]: arr[j - 1], arr[j] = arr[j], arr[j - 1] # 逆序則交換
return arr
# 4. 選擇
def csort(arr):
def argmin(arr, start):
ind = start
for i in range(start, len(arr)):
if arr[i] < arr[ind]: ind = i
return ind
# 從後面選擇乙個最小的放入排序序列的第i個
for i in range(len(arr)):
ind = argmin(arr, i)
arr[i], arr[ind] = arr[ind], arr[i]
return arr
# 5. 插入
def isort(arr, start=0, delta=1):
for i in range(start, len(arr), delta):
key, j = arr[i], i - 1
while j >= 0 and arr[j] > key:
arr[j + 1], j = arr[j], j - delta
arr[j + 1] = key
return arr
# 6. 歸併
def msort(arr):
def merge(a, b):
ind = len(a) + len(b) - 1
i, j = len(a) - 1, len(b) - 1
a = a + [0] * len(b)
while i >= 0 and j >= 0:
if a[i] > b[j]:
a[ind] = a[i]
ind, i = ind - 1, i - 1
else:
a[ind] = b[j]
ind, j = ind - 1, j - 1
while j >= 0:
a[ind] = a[j]
ind, j = ind - 1, j - 1
return a
def sort(arr, l, r):
if l >= r: return [arr[l]]
mid = l + (r - l) // 2
# 遞迴歸併左邊的和右邊的, 再合併起來
return merge(sort(arr, l, mid), sort(arr, mid + 1, r))
return sort(arr, 0, len(arr) - 1)
# 7. 希爾
def ssort(arr):
d = len(arr) // 2
while d >= 2:
for i in range(d):
# 根據某一增量進行插入排序
isort(arr, i, d)
d //= 2
return arr
import random
arr = [random.randint(0, 100) for i in range(100)]
print(bsort(arr))
print(csort(arr))
print(isort(arr))
print(ssort(arr))
print(qsort(arr))
print(msort(arr))
print(hsort(arr))
七種排序演算法
排序方法 平均情況 最好情況 最壞情況 輔助空間 穩定性插入排序 o n 2 o n o n 2 o 1 穩定希爾排序 o n log n o n 2 o n 1.3 o n 2 o 1 不穩定選擇排序 o n 2 o n 2 o n 2 o 1 不穩定氣泡排序 o n 2 o n o n 2 o ...
用js手撕七種排序演算法!!內附執行速度測試函式
sort.js description 氣泡排序1 最蠢兩兩比較替換 param arr return const bubble1 arr return arr description 氣泡排序2 避免公升序比較 利用boolean param arr return const bubble2 ar...
七種排序演算法總結
根據排序過程中借助的主要操作,將7種內排序演算法按照下圖所示進行分類。將7種演算法的各種指標進行對比,如下表所示。從平均情況來看,顯然最後3種改進演算法要勝過希爾排序,並遠遠勝過前3種簡單演算法。從最好情況看,反而冒泡和直接插入排序要更勝一籌,也就是說,如果待排序列總是基本有序,反而不應該考慮四種複...