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

โปรแกรม C++ เพื่อจัดเรียงอาร์เรย์ 10 องค์ประกอบโดยใช้ Heap Sort Algorithm


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

ตัวอย่างที่อธิบายขั้นตอนทั้งหมดใน Heap Sort มีดังนี้

อาร์เรย์ดั้งเดิมที่มี 10 องค์ประกอบก่อนการเรียงลำดับคือ −

20 7 1 54 10 15 90 23 77 25

อาร์เรย์นี้สร้างขึ้นในฮีปสูงสุดแบบไบนารีโดยใช้ max-heapify ฮีปสูงสุดนี้แสดงเป็นอาร์เรย์ดังนี้

90 77 20 54 25 15 1 23 7 10

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

1 7 10 15 20 23 25 54 77 90

โปรแกรมจัดเรียงอาร์เรย์ 10 องค์ประกอบโดยใช้อัลกอริธึมการจัดเรียงแบบฮีปมีดังต่อไปนี้

ตัวอย่าง

#include<iostream>
using namespace std;
void heapify(int arr[], int n, int i) {
   int temp;
   int largest = i;
   int l = 2 * i + 1;
   int r = 2 * i + 2;
   if (l < n && arr[l] > arr[largest])
      largest = l;
   if (r < n && arr[r] > arr[largest])
      largest = r;
   if (largest != i) {
      temp = arr[i];
      arr[i] = arr[largest];
      arr[largest] = temp;
      heapify(arr, n, largest);
   }
}
void heapSort(int arr[], int n) {
   int temp;
   for (int i = n / 2 - 1; i >= 0; i--)
      heapify(arr, n, i);
   for (int i = n - 1; i >= 0; i--) {
      temp = arr[0];
      arr[0] = arr[i];
      arr[i] = temp;
      heapify(arr, i, 0);
   }
}
int main() {
   int arr[] = { 20, 7, 1, 54, 10, 15, 90, 23, 77, 25};
   int n = 10;
i   nt i;
   cout<<"Given array is: "<<endl;
   for (i = 0; i *lt; n; i++)
   cout<<arr[i]<<" ";
   cout<<endl;
   heapSort(arr, n);
   printf("\nSorted array is: \n");
   for (i = 0; i < n; ++i)
   cout<<arr[i]<<" ";
}

ผลลัพธ์

Given array is:
20 7 1 54 10 15 90 23 77 25
Sorted array is:
1 7 10 15 20 23 25 54 77 90

ในโปรแกรมข้างต้น ฟังก์ชัน heapify() ใช้เพื่อแปลงองค์ประกอบให้เป็นฮีป ฟังก์ชันนี้เป็นฟังก์ชันแบบเรียกซ้ำและสร้างฮีปสูงสุดโดยเริ่มจากองค์ประกอบที่เรียกว่า i.e. i ในกรณีนี้ ข้อมูลโค้ดที่แสดงให้เห็นมีดังต่อไปนี้

void heapify(int arr[], int n, int i) {
   int temp;
   int largest = i;
   int l = 2 * i + 1;
   int r = 2 * i + 2;
   if (l < n && arr[l] > arr[largest])
      largest = l;
   if (r < n && arr[r] > arr[largest])
      largest = r;
   if (largest != i) {
      temp = arr[i];
      arr[i] = arr[largest];
      arr[largest] = temp;
      heapify(arr, n, largest);
   }
}

ฟังก์ชัน heapSort() ขององค์ประกอบอาร์เรย์โดยใช้การเรียงลำดับแบบฮีป มันเริ่มต้นจากโหนดที่ไม่ใช่ใบไม้และเรียก heapify() ในแต่ละโหนด สิ่งนี้จะแปลงอาร์เรย์เป็นไบนารีสูงสุดฮีป ดังแสดงดังนี้ −

for (int i = n / 2 - 1; i >= 0; i--)
heapify(arr, n, i);

หลังจากนี้ ฟังก์ชัน heapSort() จะนำองค์ประกอบรากในการวนซ้ำ for แต่ละครั้งและวางไว้ที่ส่วนท้ายของอาร์เรย์ จากนั้น heapify() จะถูกเรียกเพื่อให้แน่ใจว่าองค์ประกอบที่เหลือเป็นฮีปสูงสุด ในที่สุด องค์ประกอบทั้งหมดจะถูกลบออกจากฮีปสูงสุดโดยใช้วิธีนี้และได้อาร์เรย์ที่จัดเรียงแล้ว ดังแสดงไว้ดังนี้

for (int i = n - 1; i >= 0; i--) {
   temp = arr[0];
   arr[0] = arr[i];
   arr[i] = temp;
   heapify(arr, i, 0);
}

ในฟังก์ชัน main() อันดับแรกจะแสดงอาร์เรย์ จากนั้น ฟังก์ชัน heapSort() จะถูกเรียกเพื่อเรียงลำดับอาร์เรย์ ซึ่งได้รับจากข้อมูลโค้ดต่อไปนี้

cout<<"Given array is: "<<endl;
for (i = 0; i < n; i++)
cout<<arr[i]<<" ";
cout<<endl;
heapSort(arr, n);

ในที่สุดอาร์เรย์ที่เรียงลำดับจะปรากฏขึ้น ดังแสดงด้านล่าง

printf("\nSorted array is: \n");
for (i = 0; i < n; ++i)
cout<<arr[i]<<" ";