Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Heap Sort ใน Python คืออะไร?


Heap Sort เป็นเทคนิคการเรียงลำดับตามโครงสร้างข้อมูลไบนารีฮีป เพื่อดำเนินการเรียงลำดับแบบฮีป คุณต้องทำความคุ้นเคยกับไบนารีทรีและไบนารีฮีป

ต้นไม้ไบนารีที่สมบูรณ์คืออะไร

ต้นไม้ไบนารีที่สมบูรณ์เป็นโครงสร้างข้อมูลต้นไม้ที่ระดับทั้งหมดยกเว้นระดับสุดท้ายจะเต็มไปหมด ต้องกรอกระดับสุดท้ายจากด้านซ้าย

ไบนารี่ฮีปคืออะไร

Binary heap เป็นกรณีพิเศษของไบนารีทรี Binary heaps มีสองประเภท -

  • Max Heap - โหนดหลักในแต่ละระดับมากกว่าโหนดย่อย

  • Min Heap − โหนดหลักในแต่ละระดับมีขนาดเล็กกว่าโหนดย่อย

การแสดงอาร์เรย์ของต้นไม้ไบนารีที่สมบูรณ์

ไบนารีฮีปสามารถแสดงเป็นอาร์เรย์ได้เนื่องจากมีพื้นที่ว่างอย่างมีประสิทธิภาพ หากโหนดหลักถูกเก็บไว้ที่ดัชนี I ลูกด้านซ้ายสามารถคำนวณได้โดย 2 * i + 1 และลูกที่ถูกต้องโดย 2 *i + 2 สมมติว่าดัชนีเริ่มต้นจาก 0

อัลกอริทึมการเรียงลำดับฮีป

  • สร้างฮีปสูงสุดจากไบนารีทรีที่สมบูรณ์

  • ลบรูทและแทนที่ด้วยองค์ประกอบสุดท้ายในฮีป ลดขนาดของฮีปลง 1 และสร้างฮีปสูงสุดอีกครั้งจากโหนดที่เหลือ

  • ทำซ้ำขั้นตอนที่ 2 จนกว่าเราจะเหลือเพียง 1 โหนด

สร้างฮีปสูงสุดจากทรีไบนารีที่สมบูรณ์

นี่คือรหัสสำหรับสร้างฮีปสูงสุดจากทรีไบนารีที่สมบูรณ์ โดยที่โหนดย่อยทั้งสองจะถูกเปรียบเทียบกับรูท หากองค์ประกอบที่ใหญ่กว่าไม่ใช่รูท ให้สลับองค์ประกอบที่ใหญ่กว่ากับรูท นี่เป็นขั้นตอนแบบเรียกซ้ำ รูทปัจจุบันซึ่งเล็กกว่าโหนดย่อยจะถูกเปรียบเทียบกับทรีย่อยที่ต่ำกว่าอย่างต่อเนื่อง เว้นแต่จะถึงตำแหน่งที่ถูกต้อง

รหัสต่อไปนี้สร้างฮีปสูงสุดจากต้นไม้ไบนารีที่สมบูรณ์ ซึ่งโดยพื้นฐานแล้วคืออาร์เรย์ที่เราต้องการจัดเรียง

def heapify(arr, n, i):
   # Find largest among root and children
   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 root is not largest, swap with largest and continue heapifying
   if largest != i:
      arr[i], arr[largest] = arr[largest], arr[i]
      heapify(arr, n, largest)

การเรียงลำดับฮีป

ณ เวลานี้ เรามีฮีปสูงสุดอยู่กับเรา ตอนนี้เราต้องทำสิ่งต่อไปนี้

  • สลับรูทกับองค์ประกอบสุดท้ายในฮีป

  • ลดขนาดของฮีปลง 1 (ซึ่งหมายความว่าองค์ประกอบที่ใหญ่ที่สุดมาถึงตำแหน่งสุดท้ายแล้ว เราไม่จำเป็นต้องพิจารณาองค์ประกอบนั้น)

  • สร้างฮีปสูงสุดใหม่โดยไม่รวมองค์ประกอบสุดท้าย

  • ทำซ้ำขั้นตอนข้างต้นจนกว่าเราจะเหลือเพียง 1 องค์ประกอบ

for i in range(n-1, 0, -1):
   # Swap
   arr[i], arr[0] = arr[0], arr[i]

   # Heapify root element
   heapify(arr, i, 0)

โปรแกรมที่สมบูรณ์สำหรับการเรียงลำดับฮีปใน Python มีดังต่อไปนี้ -

def heapify(arr, n, i):
   # Find largest among root and children
   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 root is not largest, swap with largest and continue heapifying
   if largest != i:
      arr[i], arr[largest] = arr[largest], arr[i]
      heapify(arr, n, largest)

def heapSort(arr):
   n = len(arr)
   # Build max heap
   for i in range(n//2, -1, -1):
      heapify(arr, n, i)
   for i in range(n-1, 0, -1):
      # Swap
      arr[i], arr[0] = arr[0], arr[i]
      # Heapify root element
      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=' ')

ความซับซ้อนของเวลา - O(n logn)