堆排序 python 實現

2021-10-24 08:18:18 字數 1928 閱讀 1362

超詳細!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

堆排序基本思想及步驟

將待排序的陣列 初始化 為大頂堆,即建堆。

將 堆頂元素 與 最後乙個元素 交換,(除去最後乙個元素外)可以組建為乙個新的大頂堆。

由於第二部堆頂元素跟最後乙個元素交換後,新建立的堆不是大頂堆

需要重新建立大頂堆。重複上面的處理流程,直到堆中僅剩下乙個元素。 注意

初始建堆: 從 非 葉子結點

自下而上 完成每個建堆操作

每個建堆操作:

比較 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...