超詳細!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
堆排序基本思想及步驟
將待排序的陣列 初始化 為大頂堆,即建堆。
將 堆頂元素 與 最後乙個元素 交換,(除去最後乙個元素外)可以組建為乙個新的大頂堆。
由於第二部堆頂元素跟最後乙個元素交換後,新建立的堆不是大頂堆,
需要重新建立大頂堆。重複上面的處理流程,直到堆中僅剩下乙個元素。 注意
初始建堆: 從 非 葉子結點
自下而上 完成每個建堆操作
每個建堆操作:
比較 parent 和left 對應元素大小,得到larger_index
比較 larger_index和 right 對應元素大小, 得到larger_index
class
solution
(object):
defheap_sort
(self, nums)
: i, l =0,
len(nums)
self.nums = nums
# 構造大頂堆,從非葉子節點開始倒序遍歷,因此是l//2 -1 就是最後乙個非葉子節點
for i in
range
(l//2-
1,-1
,-1)
: self.build_heap(i, l-1)
# 上面的迴圈完成了大頂堆的構造,那麼就開始把根節點跟末尾節點交換,然後重新調整大頂堆
for j in
range
(l-1,-
1,-1
):nums[0]
, nums[j]
= nums[j]
, nums[0]
self.build_heap(
0, j-1)
return nums
defbuild_heap
(self, i, l)
:"""構建大頂堆"""
nums = self.nums
left, right =
2*i+1,
2*i+
2## 左右子節點的下標
large_index = i
if left <= l and nums[i]
< nums[left]
: large_index = left
if right <= l and nums[left]
< nums[right]
: large_index = right
# 通過上面跟左右節點比較後,得出三個元素之間較大的下標,如果較大下表不是父節點的下標,說明交換後需要重新調整大頂堆
if large_index != i:
nums[i]
, nums[large_index]
= nums[large_index]
, nums[i]
self.build_heap(large_index, l)
建最大堆o(n):非葉子結點最多要被交換和比較兩次
調整堆o(logn) 再重建o(n)同1,即每次交換後重建的複雜度o(nlogn)
具體見第二張圖封開分析,第一張圖是整體2整體複雜度
堆排序總體時間複雜度 o(nlogn)
Python實現堆排序
usr bin env python coding utf 8 堆排序 class heap object 求給定下標i的父節點下標 defparent self,i if i 2 0 return i 2 1 else return i 2 求給定下標i的左孩子下標 defleft self,i ...
堆排序python實現
因為部門頻繁調整,半年多時間直接上級換了三個,之前一起工作的同事被調離的時候大頭沒有放我過去,說還有業務讓我支撐,在這次調整大頭也被調走了,現在小團隊的業務已經不再重要,人也都是一些老弱病殘,並且技術路線也與部門大團隊完全不同,因此,最近想換乙個公司或者部門來尋找更好的發展。當我前幾天到公司另乙個部...
python 實現堆排序
原理 迴圈陣列,依次構建最大堆,構建完以後第乙個元素就為最大值 swap 到最後乙個位置,繼續對 陣列中 0 last 1 這個新陣列構建最大堆 依次類推 到最後構建完成 arr 55,67,89,12,4,6,2,34,33,12 arrlen int len arr 調整三個元素堆 defadj...