#!/usr/bin/env python
# @Desc : 各種排序算法
# 插入排序
def InserteSort(arr):
"""插入直到1"""
if not arr:
return []
for i in range(len(arr)):
for j in range(i, 0, -1):
if arr[j] < arr[j-1]:
arr[j], arr[j-1] = arr[j-1], arr[j]
print(arr)
# 選擇排序
def SelectSort(arr):
if not arr:
return []
for start in range(len(arr)):
amin = start
for i in range(start, len(arr)):
if arr[i] < arr[amin]:
amin = i
arr[amin], arr[start] = arr[start], arr[amin]
print(arr)
# 冒泡排序
def BubblingSort(arr):
"""在尾部進行選擇排序"""
if not arr:
return []
for end in range(len(arr)-1, -1, -1):
flag = True
for i in range(end):
if arr[i] > arr[i+1]:
arr[i], arr[i+1] = arr[i+1], arr[i]
flag = False
if flag:
print('--', arr)
print(arr)
# 快速排序 遞歸 space(n)
def QuickSort_rec(arr):
if not arr:
return []
target = arr[-1]
left = [x for x in arr if x < target]
mid = [x for x in arr if x == target]
right = [x for x in arr if x > target]
return QuickSort_rec(left) + mid + QuickSort_rec(right)
# 原地快排, 需要用到partition函數(shù)
def QuickSort(arr, left, right):
if left < right:
L, R = partition(arr, left, right)
QuickSort(arr, left, L-1)
QuickSort(arr, R+1, right)
# space O(1)
def partition(arr, left, right):
cur = left
target = right
while left < right:
if arr[cur] > arr[target]:
right -= 1
arr[cur], arr[right] = arr[right], arr[cur]
elif arr[cur] == arr[target]:
cur += 1
elif arr[cur] < arr[target]:
arr[cur], arr[left] = arr[left], arr[cur]
cur += 1
left += 1
arr[target], arr[right] = arr[right], arr[target]
return left, right
# 歸并排序 O(nlogn) space O(n)
def mergeSort(arr):
if len(arr) < 2:
return arr
mid = len(arr) // 2
left = mergeSort(arr[:mid])
right = mergeSort(arr[mid:])
result = []
while left and right:
if left[0] > right[0]:
result.append(right.pop(0))
else:
result.append(left.pop(0))
if left:
result += left
if right:
result += right
return result
# !!!堆排序
# 大的向上跑
def heapCreate(arr, idx):
"""組建大根堆"""
while arr[idx] > arr[int((idx - 1) / 2)]:
arr[idx], arr[int((idx - 1) / 2)] = arr[int((idx - 1) / 2)], arr[idx]
idx = int((idx - 1) / 2)
# 大的向下跑
def heapify(arr, idx, size):
"""找到最大的放在上面用于交換,放到序列尾部"""
left = idx * 2 + 1
while left < size:
# 左右誰最大
largest = left + 1 if left + 1 < size and arr[left+1] > arr[left] else left
# 孩子和父親誰大
largest = largest if arr[largest] > arr[idx] else idx
if largest == idx:
break
# 交換
arr[idx], arr[largest] = arr[largest], arr[idx]
idx = largest
left = idx * 2 + 1
def heapSort(arr):
# O(n)
for i in range(len(arr)):
heapCreate(arr, i)
print("HeapInsert:", arr)
size = len(arr) - 1
# O(logn)
while size > 0:
arr[0], arr[size] = arr[size], arr[0]
size -= 1
heapify(arr, 0, size)
print(arr)
if __name__ == '__main__':
import random
a = [7, 5, 4, 3, 2, 1]
random.shuffle(a)
print('raw:', a)
heapSort(a)
record
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悬而,“玉大人呜舒,你說我怎么就攤上這事”康欤” “怎么了袭蝗?”我有些...
- 文/不壞的土叔 我叫張陵,是天一觀的道長般婆。 經(jīng)常有香客問我到腥,道長,這世上最難降的妖魔是什么蔚袍? 我笑而不...
- 正文 為了忘掉前任乡范,我火速辦了婚禮,結(jié)果婚禮上啤咽,老公的妹妹穿的比我還像新娘晋辆。我一直安慰自己,他們只是感情好宇整,可當(dāng)我...
- 文/花漫 我一把揭開白布栈拖。 她就那樣靜靜地躺著,像睡著了一般没陡。 火紅的嫁衣襯著肌膚如雪涩哟。 梳的紋絲不亂的頭發(fā)上索赏,一...
- 文/蒼蘭香墨 我猛地睜開眼精钮,長吁一口氣:“原來是場噩夢啊……” “哼威鹿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起轨香,我...
- 正文 年R本政府宣布,位于F島的核電站嘁灯,受9級特大地震影響泻蚊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丑婿,卻給世界環(huán)境...
- 文/蒙蒙 一性雄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧羹奉,春花似錦秒旋、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至耕挨,卻和暖如春细卧,著一層夾襖步出監(jiān)牢的瞬間尉桩,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- Unlike general bookkeeping tools, an innovative sub-categ...
- What class do you go to today? What class do you go to to...
- 三四天未見屈扎,睜眼找恐龍書包,而非媽媽撩匕,小小失落一下鹰晨。 擁抱家人,上班出門前抱她滑沧,人家在低頭研究繪本上的大眼睛并村,不過...
- 姥姥巍实,我們?nèi)サ昀锪俗壹迹莅荩?整得她每天都要去店里上班打卡似的。 事實證明棚潦,還算是一個得力的小助手令漂。 玩玩具,看看書...
- This is a simple and practical pet shop work list managem...