Heap Sort คืออะไร
Heap Sort เป็นอัลกอริทึมการจัดเรียงที่อิงโครงสร้างข้อมูล Binary Heap ก่อนเรียนรู้ Heap Sort ควรเข้าใจ Binary Tree และ Binary Heap ก่อน
Complete Binary Tree คืออะไร
Complete Binary Tree คือต้นไม้ที่ทุกระดับเต็มไปด้วยโหนด ยกเว้นระดับสุดท้ายที่ต้องเต็มจากซ้ายไปขวา
Binary Heap คืออะไร
Binary Heap เป็นกรณีพิเศษของ Binary Tree แบ่งเป็น 2 ประเภท:
- Max Heap: โหนดพ่อมีค่ามากกว่าลูกทุกคู่
- Min Heap: โหนดพ่อมีค่าน้อยกว่าลูกทุกคู่
Array Representation ของ Complete Binary Tree
Binary Heap แทนเป็น Array ได้เพราะประหยัดพื้นที่ หากพ่ออยู่ index i ลูกซ้าย = 2*i+1 ลูกขวา = 2*i+2 (index เริ่มที่ 0)
Heap Sort Algorithm
- สร้าง Max Heap จาก Complete Binary Tree
- สลับ Root กับโหนดสุดท้าย ลดขนาด heap 1 สร้าง Max Heap ใหม่จากโหนดที่เหลือ
- ทำซ้ำข้อ 2 จนเหลือ 1 โหนด
ฟังก์ชัน Heapify (สร้าง Max Heap)
def heapify(arr, n, i):
# หาค่าสูงสุดระหว่าง root และลูก
largest = i
l = 2 * i + 1
r = 2 * i + 2
if l < n and arr[i] < arr[l]:
largest = l
if r < n and arr[largest] < arr[r]:
largest = r
# ถ้า root ไม่ใช่ค่าสูงสุด สลับและ heapify ต่อ
if largest != i:
arr[i], arr[largest] = arr[largest], arr[i]
heapify(arr, n, largest)
Heap Sort หลัก
def heapSort(arr):
n = len(arr)
# สร้าง max heap
for i in range(n//2, -1, -1):
heapify(arr, n, i)
# สลับและ heapify ซ้ำ
for i in range(n-1, 0, -1):
arr[i], arr[0] = arr[0], arr[i] # สลับ
heapify(arr, i, 0) # heapify root
โปรแกรมสมบูรณ์
def heapify(arr, n, i):
largest = i
l = 2 * i + 1
r = 2 * i + 2
if l < n and arr[i] < arr[l]:
largest = l
if r < n and arr[largest] < arr[r]:
largest = r
if largest != i:
arr[i], arr[largest] = arr[largest], arr[i]
heapify(arr, n, largest)
def heapSort(arr):
n = len(arr)
for i in range(n//2, -1, -1):
heapify(arr, n, i)
for i in range(n-1, 0, -1):
arr[i], arr[0] = arr[0], arr[i]
heapify(arr, i, 0)
arr = [1, 12, 9, 5, 6, 10]
heapSort(arr)
n = len(arr)
print("Sorted array is")
for i in range(n):
print(arr[i], end=' ')
ผลลัพธ์
Sorted array is
1 5 6 9 10 12
Time Complexity
O(n log n) ในทุกกรณี (best, average, worst)