#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);
}
}