Sorting Techniques
Sorting Techniques
1.
#include <stdio.h>
                                                  OR
#include <stdio.h>
void swap(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}
int partition(int arr[], int low, int high) {
    // Initialize pivot to be the first element
    int p = arr[low];
    int i = low;
    int j = high;
    while (i < j) {
        // Find the first element greater than
        // the pivot (from starting)
        while (arr[i] <= p && i <= high - 1) {
            i++;
        }
2.
HEAP SORT
#include <stdio.h>
// Function to swap two elements
void swap(int *a, int *b) {
   int t = *a;
   *a = *b;
   *b = t;
}
/* heapify the subtree with root i */
void heapify(int* arr, int n, int i)
{
   // store largest as the root element
   int largest = i;
   int left = 2 * i + 1;
   int right = 2 * i + 2;
   // now check whether the right and left right is larger than the root or not
   if (left < n && arr[left] > arr[largest])
   {
       largest = left;
   }
  if (right < n && arr[right] > arr[largest])
  {
      largest = right;
  }
  // if the root is smaller than the children then swap it with the largest children's value
  if (largest != i)
  {
      swap(&arr[i], &arr[largest]);
      // again heapify that side of the heap where the root has gone
      heapify(arr, n, largest);
  }
}
/* sorts the given array of n size */
void heapsort(int* arr, int n)
{
   // build the binary max heap
   for (int i = n / 2 - 1; i >= 0; i--)
   {
       heapify(arr, n, i);
   }
   // sort the max heap
   for (int i = n - 1; i >= 0; i--)
   {
       // swap the root node and the last leaf node
       swap(&arr[i], &arr[0]);
       // again heapify the max heap from the root
       heapify(arr, i, 0);
   }
}
int main()
{
   int i, count, number[25];
   printf("How many elements are u going to enter?: ");
   scanf("%d",&count);
     for(i=0;i<count;i++)
     {
        printf("\nEnter %d element: ", i+1);
        scanf("%d",&number[i]);
     }
     heapsort(number,count);
     printf("Order of Sorted elements: ");
     for(i=0;i<count;i++)
     printf(" %d",number[i]);
     return 0;
 }
                                                  OR
#include <stdio.h>
// Heapify function
void heapify(int arr[], int n, int i)
{
     int temp, maximum, left_index, right_index;
     // currently assuming i postion to
     // be holding the largest value
     maximum = i;
     // right child index
     right_index = 2 * i + 2;
     // left child index
     left_index = 2 * i + 1;
     // if left index value is grater than the current index
     // value
     if (left_index < n && arr[left_index] > arr[maximum])
       maximum = left_index;
     // if right index value is grater than the current index
    // value
    if (right_index < n && arr[right_index] > arr[maximum])
        maximum = right_index;
    // checking if we needed swaping the elements or not
    if (maximum != i) {
        temp = arr[i];
        arr[i] = arr[maximum];
        arr[maximum] = temp;
        heapify(arr, n, maximum);
    }
}
// HeapSorting function
void heapsort(int arr[], int n)
{
    int i, temp;
    // performing heapify on the non leaf nodes so n/2 - 1
    // to 0 are the non leaf nodes
    for (i = n / 2 - 1; i >= 0; i--) {
        heapify(arr, n, i);
    }
    // the current array is changed to max heap
    for (i = n - 1; i > 0; i--) {
        temp = arr[0];
        arr[0] = arr[i];
        arr[i] = temp;
        heapify(arr, i, 0);
    }
}
// Driver code
int main()
{
     // initializing the array
     int arr[] = { 20, 18, 5, 15, 3, 2 };
     int n = 6;
     // Displaying original array
     printf("Original Array : ");
     for (int i = 0; i < n; i++) {
         printf("%d ", arr[i]);
     }
     printf("\n");
     heapsort(arr, n);
     // Displaying sorted array
     printf("Array after performing heap sort: ");
     for (int i = 0; i < n; i++) {
         printf("%d ", arr[i]);
     }
     return 0;
}
3.
MERGE SORT
#include <stdio.h>
void merge(int A[], int mid, int low, int high)
{
  int i, j, k, B[100];
  i = low;
  j = mid + 1;
    k = low;
    while (i <= mid && j <= high)
    {
       if (A[i] < A[j])
       {
           B[k] = A[i];
           i++;
           k++;
       }
       else
       {
           B[k] = A[j];
           j++;
           k++;
       }
    }
    while (i <= mid)
    {
       B[k] = A[i];
       k++;
       i++;
    }
    while (j <= high)
    {
       B[k] = A[j];
       k++;
       j++;
    }
        // It will copy data from temporary array to array
    for (int i = low; i <= high; i++)
    {
       A[i] = B[i];
    }
}
void mergeSort(int number[], int low, int high)
{
  int mid;
  if(low<high)
      {
            // finding the mid value of the array.
     mid = (low + high) /2;
            // Calling the merge sort for the first half
     mergeSort(number, low, mid);
            // Calling the merge sort for the second half
     mergeSort(number, mid+1, high);
            // Calling the merge function
     merge(number, mid, low, high);
  }
}
int main()
{
   int i, count, number[25];
   printf("How many elements are u going to enter?: ");
   scanf("%d",&count);
   for(i=0;i<count;i++)
   {
      printf("\nEnter %d element: ", i+1);
      scanf("%d",&number[i]);
   }
   mergeSort(number,0,count-1);
   printf("Order of Sorted elements: ");
   for(i=0;i<count;i++)
   printf(" %d",number[i]);
   return 0;
}
                                           OR
#include <stdio.h>
#include <stdlib.h>
// Merges two subarrays of arr[].
// First subarray is arr[left..mid]
// Second subarray is arr[mid+1..right]
void merge(int arr[], int left, int mid, int right) {
  int i, j, k;
  int n1 = mid - left + 1;
  int n2 = right - mid;
  // Create temporary arrays
  int leftArr[n1], rightArr[n2];
  // Copy data to temporary arrays
  for (i = 0; i < n1; i++)
     leftArr[i] = arr[left + i];
  for (j = 0; j < n2; j++)
     rightArr[j] = arr[mid + 1 + j];
  // Merge the temporary arrays back into arr[left..right]
  i = 0;
  j = 0;
  k = left;
  while (i < n1 && j < n2) {
     if (leftArr[i] <= rightArr[j]) {
         arr[k] = leftArr[i];
         i++;
     }
     else {
         arr[k] = rightArr[j];
         j++;
     }
        k++;
    }
    // Copy the remaining elements of leftArr[], if any
    while (i < n1) {
        arr[k] = leftArr[i];
        i++;
        k++;
    }
    // Copy the remaining elements of rightArr[], if any
    while (j < n2) {
        arr[k] = rightArr[j];
        j++;
        k++;
    }
}
// The subarray to be sorted is in the index range [left-right]
void mergeSort(int arr[], int left, int right) {
    if (left < right) {
        // Calculate the midpoint
        int mid = left + (right - left) / 2;
        // Sort first and second halves
        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);
        // Merge the sorted halves
        merge(arr, left, mid, right);
    }
}
int main() {
    int arr[] = { 12, 11, 13, 5, 6, 7 };
    int n = sizeof(arr) / sizeof(arr[0]);
     // Sorting arr using mergesort
    mergeSort(arr, 0, n - 1);
    for (int i = 0; i < n; i++)
      printf("%d ", arr[i]);
    return 0;
}