隨時要手撕的七種排序演算法

2021-10-09 05:33:59 字數 2965 閱讀 4956

隨時要手撕的七種排序演算法
# 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種簡單演算法。從最好情況看,反而冒泡和直接插入排序要更勝一籌,也就是說,如果待排序列總是基本有序,反而不應該考慮四種複...