Algorithm - SORT

1 minute read

#include <iostream>

using namespace std;

#define ARR_SIZE sizeof(arr) / sizeof(int)
#define SWAP(a, b) { int temp = a; a = b; b = temp; }

int arr[] = {3, 19, 2, 30, 29, 18, 11, 50, 9, 0};

void quickSort(int, int);
void mergeSort(int, int);

int main() {
  // Quick Sort
  quickSort(0, ARR_SIZE - 1);

  // Merge Sort
  mergeSort(0, ARR_SIZE - 1);

  return 0;
}

void quickSort(int left, int right) {
  if (left < right) {
    int pivot = left;
    int l = left;
    int r = right;

    while (l < r) {
      while (arr[pivot] >= arr[l] && l < right)
        l++;
      while (arr[pivot] < arr[r] && r > left)
        r--;

      if (l < r) {
        SWAP(arr[l], arr[r]);
      }
    }
    SWAP(arr[pivot], arr[r]);

    quickSort(left, r - 1);
    quickSort(r + 1, right);
  }
}

void merge(int start, int mid, int end) {
  int i = start;
  int j = mid + 1;
  int idx = 0;

  int size = end - start + 1;
  int *temp = new int[size];

  while (i <= mid && j <= end) {
    if (arr[i] < arr[j]) {
      temp[idx++] = arr[i++];
    } else {
      temp[idx++] = arr[j++];
    }
  }

  while (i <= mid) {
    temp[idx++] = arr[i++];
  }
  while (j <= end) {
    temp[idx++] = arr[j++];
  }

  int l = 0;
  for (int k = start; k <= end; ++k) {
    arr[k] = temp[l++];
  }
  delete[] temp;
}

void mergeSort(int start, int end) {
  if (start < end) {
    int mid = (start + end) / 2;

    mergeSort(start, mid);
    mergeSort(mid + 1, end);
    merge(start, mid, end);
  }
}