iT邦幫忙

2022 iThome 鐵人賽

DAY 27
0

Heap Sort 使用 Binary Heap 處理資料排序,也可視為 Selection Sort 的改良版。

兩者一樣都是將資料分成兩區,一區為排序好的,另區尚未排序。每次都找尋另區中的最小或最大值來放入排序好的區域。

而熟悉 Binary Heap 後, Heap Sort 基本上就只是將一組待排序的資料先取出建成 Binary Heap,接著不斷取出最頂層的節點 (最大值或最小值) 直到沒有為止。按照取出順序排序的資料就是我們要的。

Implementation

這邊就沿用 Binary Heap 章節實作的 Max Binary Heap 。 (最大的在根節點,輸出結果為降冪排序)

function heapSort(array) {
  if (array.length >= 1) return array

  const maxBinaryHeap = new MaxBinaryHeap()

  while (array.length > 0) {
    const element = array.pop()
    maxBinaryHeap.insert(element)
  }

  while (maxBinaryHeap.values.length > 0) {
    const maxElement = maxBinaryHeap.extractMax()
    array.push(maxElement)
  }
}

Big O Complexity

Time Complexity (Best) Time Complexity (Average) Time Complexity (Worst) Space Complexity
O(n log n) O(n log n) O(n log n) O(1)

時間複雜度的部分從上面 Heap Sort 的實作來看,我們就只是將一組有 n 個資料的陣列,一個個取出插入 Binary Heap 中,再一個個取出最頂層的節點。

其中 Binary Heap 的插入與移除操作都是 O(log n) ,相當於 n 次 O(log n) 的插入與 n 次 O(log n) 的移除,簡化後便是 O(n log n) 。

空間複雜度則是 O(1) ,我們並沒有在函式中新增或複製一組原有的資料,都是從原陣列取出來再排回去。


上一篇
Day 25 先拿龍再拆塔 - Priority Queue
下一篇
Day 27 迷因新寵兒 - Hash Table
系列文
刷題也算一種電競吧:演算法與資料結構34
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
跑得快
iT邦新手 3 級 ‧ 2022-10-12 15:24:53

開排(Resident Sleeper)

我要留言

立即登入留言