Heap Sort
/*******************************************************************************/
#include <stdio.h>
// Function to perform heapify on a subtree rooted at index i in the given array
void heapify(int arr[], int n, int i) {
    int largest = i;    // Initialize largest as the root
    int left_child = 2 * i + 1;
    int right_child = 2 * i + 2;
    // Compare with left child
    if (left_child < n && arr[left_child] > arr[largest]) {
        largest = left_child;
    }
    // Compare with right child
    if (right_child < n && arr[right_child] > arr[largest]) {
        largest = right_child;
    }
    // If the largest is not the root, swap and continue heapifying
    if (largest != i) {
        int temp = arr[i];
        arr[i] = arr[largest];
        arr[largest] = temp;
        heapify(arr, n, largest);
    }
}
// Main function to perform Heap Sort
void heapSort(int arr[], int n) {
    // Build a max-heap
    for (int i = n / 2 - 1; i >= 0; i--) {
        heapify(arr, n, i);
    }
    // Extract elements from the heap one by one
    for (int i = n - 1; i > 0; i--) {
        // Swap the root (maximum element) with the last element
        int temp = arr[0];
        arr[0] = arr[i];
        arr[i] = temp;
        // Call heapify on the reduced heap
        heapify(arr, i, 0);
    }
}
int main() {
  int arr[50],n,i;
  printf("Enter size of the array: ");
  scanf("%d",&n);
  printf("Enter %d elements:\n",n);
  for(i=0;i<n;i++)
    scanf("%d",&arr[i]);
    heapSort(arr, n);
    printf("\nSorted array: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
        }
    return 0;
}
/* Heap Sort Alternate Implementation */
void heapsort(int a[],int n);
void buildheap(int a[],int n);
void extractmax(int a[],int n);
void heapify(int a[],int i, int n);
void swap (int a[],int i, int j);
void heapsort(int a[],int n)
{
//build heap structure
buildheap(a,n);
//extract maxima
extractmax(a,n);
}
void buildheap(int a[],int n)
{
//let heap grow from half size to entire size
for(int i=n/2-1; i>=0; i--)
{
heapify(a,i,n);
}
}
void extractmax(int a[],int n)
{
//n is separator between heap and sorted part
while (n>1)
{
n--;
//put maximum at the end of heap
swap(a,0,n);
//restore heap
heapify(a,0,n);
}
}
//restore heap invariant
void heapify(int a[],int i, int n)
{
int k=2*i+1; //first child of i
while (k<n)
{
//if another child exists and that child is the maximum
if (k+1<n && a[k+1]>a[k]) k++;
if (a[i]>=a[k])
{
return; //heap invariant restored
}
else 
{
//swap element with its child
swap(a,i, k);
//continue with next iteration
i=k;
k=2*i+1;
}
}
}
void swap (int a[],int i, int j)
{
int t;
t= a[i];
a[i] = a[j];
a[j] = t;
}
int main()
{
//swap element with its child
swap(a,i, k);
//continue with next iteration
i=k;
k=2*i+1;
}
}
}
void swap (int a[],int i, int j)
{
int t;
t= a[i];
a[i] = a[j];
a[j] = t;
}
int main()
{
int size,i;
printf("Enter size of the array: ");
scanf("%d",&size);
int a[size];
printf("Enter %d elements: ",size);
for(i=0;i<size;i++)
scanf("%d",&a[i]);
heapsort(a,size);
printf("Sorted elements: ");
for(i=0;i<size;i++)
printf(" %d",a[i]);
return 0;
}
 
int size,i;
printf("Enter size of the array: ");
scanf("%d",&size);
int a[size];
printf("Enter %d elements: ",size);
for(i=0;i<size;i++)
scanf("%d",&a[i]);
heapsort(a,size);
printf("Sorted elements: ");
for(i=0;i<size;i++)
printf(" %d",a[i]);
return 0;
}
Comments
Post a Comment