文章目錄
1. 選擇排序
選擇排序原理是先選出最小的數,與第一個數交換,然後從第二個數開始再選擇最小的數與第二個數交換,……
def selection_sort(data):
for i in range(len(data) - 1):
min = data[i]
k = i
for j in range(i, len(data)):
if data[j] < min:
min = data[j]
k = j
if i <> k:
data[i], data[k] = data[k], data[i]
2. 堆排序
堆排序的原理將數組調整成堆,然後將堆頂元素與最後一個元素交換,然後將最後一個節點剔除出堆,再將剩下的數組調整成堆,然後再交換堆頂元素與最後一個元素……
def heap_adjust(data, s, m):
if 2 * s > m:
return
temp = s - 1
if data[2*s - 1] > data[temp]:
temp = 2 * s - 1
if 2 * s <= m - 1 and data[2*s] > data[temp]:
temp = 2 * s
if temp <> s - 1:
data[s - 1], data[temp] = data[temp], data[s - 1]
heap_adjust(data, temp + 1, m)
def heap_sort(data):
m = len(data) / 2
for i in range(m, 0, -1):
heap_adjust(data, i, len(data))
data[0], data[-1] = data[-1], data[0]
for n in range(len(data) - 1, 1, -1):
heap_adjust(data, 1, n)
data[0], data[n - 1] = data[n - 1], data[0]
3. 效率
堆排序的效率還是蠻高的,結果如下:
selection_sort 0:00:02.219000
heap_sort 0:00:00.157000
Python 天天美味系列(總)
Python 天天美味(30) - python資料結構與演算法之快速排序
Python 天天美味(31) - python資料結構與演算法之插入排序
Python 天天美味(32) - python資料結構與演算法之堆排序
Python 天天美味(33) - 五分鐘理解元類(Metaclasses)[轉]
Python 天天美味(34) - Decorators詳解