Python 堆排序

  本來想寫一篇關於堆排序的詳細教程的,發現本身不會畫圖,QAQ。並且也不必定會畫的比別人好看多少,尷尬的我上個人代碼把。html

我簡單的說一下思路:咱們構建的堆結構是邏輯結構。若是列表須要升序排列就構建一個大頂堆,降序就小頂堆。大頂堆的定義是該節點比其左右子節點都大,小頂堆相反。第一步構建完大頂堆,堆頂元素就是列表中最大元素,第二步把堆頂元素和第一個元素交換位置,第三步再調整成大頂堆,循環第二步和第三步。直到列表有序。堆排序是不穩定的(不穩定:不保證列表中兩個相等的數的先後位置在排序後和排序前同樣)。spa

 1 import math
 2 
 3 
 4 def sort(arr):
 5     # 構建大頂堆, math.floor(), 向下取整, 由於構建大頂堆是從最後一個非葉子節點開始的
 6     for i in range(math.floor(len(arr) / 2) - 1, -1, -1):
 7         adjust_heap(arr, i, len(arr))
 8     # 調整 和 把堆頂這個最大數和最後一個數交換
 9     for i in range(len(arr) - 1, 0, -1):
10         arr[i], arr[0] = arr[0], arr[i]
11         adjust_heap(arr, 0, i)
12 
13 
14 def adjust_heap(arr, i, length):
15     '''
16     調整,每一次傳過來的 i 節點及其子節點調整成大頂堆,
17     若是不調其子節點有可能致使其子節點不是一個大頂堆
18     '''
19     temp = arr[i]
20     k = 2 * i + 1
21     while k < length:
22         if k + 1 < length and arr[k] < arr[k + 1]:
23             k += 1
24         if arr[k] > temp:
25             arr[i] = arr[k]
26             i = k
27         k = k * 2 + 1
28     arr[i] = temp
29 
30 
31 test_list = [9, 8, 7, 6, 5, 4, 8, 2, 1]
32 sort(test_list)
33 print(test_list)

http://www.javashuo.com/article/p-wtyhbkog-dg.html 這一篇文章教的挺詳細的,你們不懂的能夠看一看。code

相關文章
相關標籤/搜索