国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python實現堆排序的方法詳解

2019-11-25 16:48:54
字體:
來源:轉載
供稿:網友

本文實例講述了Python實現堆排序的方法。分享給大家供大家參考,具體如下:

堆排序作是基本排序方法的一種,類似于合并排序而不像插入排序,它的運行時間為O(nlogn),像插入排序而不像合并排序,它是一種原地排序算法,除了輸入數組以外只占用常數個元素空間。

堆(定義):(二叉)堆數據結構是一個數組對象,可以視為一棵完全二叉樹。如果根結點的值大于(小于)其它所有結點,并且它的左右子樹也滿足這樣的性質,那么這個堆就是大(小)根堆。

我們假設某個堆由數組A表示,A[1]為樹的根,給定某個結點的下標i,其父結點、左孩子、右孩子的下標都可以計算出來:

PARENT(i):
    return i/2
LEFT(i):
    return 2i
RIGHT(i):
    return 2i+1

堆排序Python實現

所謂堆排序的過程,就是把一些無序的對象,逐步建立起一個堆的過程。
下面是用Python實現的堆排序的代碼:

def build_max_heap(to_build_list):  """建立一個堆"""  # 自底向上建堆  for i in range(len(to_build_list)/2 - 1, -1, -1):    max_heap(to_build_list, len(to_build_list), i)def max_heap(to_adjust_list, heap_size, index):  """調整列表中的元素以保證以index為根的堆是一個最大堆"""  # 將當前結點與其左右子節點比較,將較大的結點與當前結點交換,然后遞歸地調整子樹  left_child = 2 * index + 1  right_child = left_child + 1  if left_child < heap_size and to_adjust_list[left_child] > to_adjust_list[index]:    largest = left_child  else:    largest = index  if right_child < heap_size and to_adjust_list[right_child] > to_adjust_list[largest]:    largest = right_child  if largest != index:    to_adjust_list[index], to_adjust_list[largest] = /    to_adjust_list[largest], to_adjust_list[index]    max_heap(to_adjust_list, heap_size, largest)def heap_sort(to_sort_list):  """堆排序"""  # 先將列表調整為堆  build_max_heap(to_sort_list)  heap_size = len(to_sort_list)  # 調整后列表的第一個元素就是這個列表中最大的元素,將其與最后一個元素交換,然后將剩余的列表再調整為最大堆  for i in range(len(to_sort_list) - 1, 0, -1):    to_sort_list[i], to_sort_list[0] = to_sort_list[0], to_sort_list[i]    heap_size -= 1    max_heap(to_sort_list, heap_size, 0)if __name__ == '__main__':  to_sort_list = [4, 1, 3, 2, 16, 9, 10, 14, 8, 7]  heap_sort(to_sort_list)  print to_sort_list

更多關于Python相關內容可查看本站專題:《Python正則表達式用法總結》、《Python數據結構與算法教程》、《Python Socket編程技巧總結》、《Python函數使用技巧總結》、《Python字符串操作技巧匯總》、《Python入門與進階經典教程》及《Python文件與目錄操作技巧匯總

希望本文所述對大家Python程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 原阳县| 土默特左旗| 全椒县| 湟中县| 自贡市| 竹北市| 科尔| 汉沽区| 托克逊县| 襄垣县| 扬中市| 南召县| 安义县| 昌乐县| 朝阳市| 鄯善县| 巴中市| 齐齐哈尔市| 十堰市| 清苑县| 新津县| 若羌县| 霍州市| 镇平县| 遵义县| 临泽县| 东乌| 城市| 延川县| 揭西县| 广丰县| 宁安市| 宁蒗| 宁夏| 宜春市| 广河县| 定陶县| 岐山县| 景宁| 贺兰县| 深水埗区|