Implement Quick sort and Merge sort and observe the execution time for various input sizes (Average, Worst and Best cases).

 #include <stdio.h>

#include <stdlib.h>

#include <time.h>


// ---------------- Quick Sort ----------------

int partition(int arr[], int low, int high) {

    int pivot = arr[high]; // last element as pivot

    int i = (low - 1), temp;


    for (int j = low; j < high; j++) {

        if (arr[j] <= pivot) {

            i++;

            temp = arr[i], arr[i] = arr[j], arr[j] = temp;

        }

    }

    temp = arr[i + 1], arr[i + 1] = arr[high], arr[high] = temp;

    return i + 1;

}


void quickSort(int arr[], int low, int high) {

    if (low < high) {

        int pi = partition(arr, low, high);

        quickSort(arr, low, pi - 1);

        quickSort(arr, pi + 1, high);

    }

}


// ---------------- Merge Sort ----------------

void merge(int arr[], int l, int m, int r) {

    int i, j, k;

    int n1 = m - l + 1, n2 = r - m;


    int* L = (int*)malloc(n1 * sizeof(int));

    int* R = (int*)malloc(n2 * sizeof(int));


    for (i = 0; i < n1; i++) L[i] = arr[l + i];

    for (j = 0; j < n2; j++) R[j] = arr[m + 1 + j];


    i = j = 0, k = l;

    while (i < n1 && j < n2) arr[k++] = (L[i] <= R[j]) ? L[i++] : R[j++];

    while (i < n1) arr[k++] = L[i++];

    while (j < n2) arr[k++] = R[j++];


    free(L); free(R);

}


void mergeSort(int arr[], int l, int r) {

    if (l < r) {

        int m = l + (r - l) / 2;

        mergeSort(arr, l, m);

        mergeSort(arr, m + 1, r);

        merge(arr, l, m, r);

    }

}


// ---------------- Helpers ----------------

void fillAscending(int arr[], int n) {

    for (int i = 0; i < n; i++) arr[i] = i;

}


void fillDescending(int arr[], int n) {

    for (int i = 0; i < n; i++) arr[i] = n - i;

}


void fillRandom(int arr[], int n) {

    for (int i = 0; i < n; i++) arr[i] = rand() % 100000;

}


void copyArray(int* dest, int* src, int n) {

    for (int i = 0; i < n; i++) dest[i] = src[i];

}


void testSorts(int n) {

    int* base = (int*)malloc(n * sizeof(int));

    int* arr = (int*)malloc(n * sizeof(int));

    clock_t start, end;

    double timeQS, timeMS;


    printf("\nArray size: %d\n", n);


    // --- Best Case (ascending for MergeSort)

    fillAscending(base, n);

    copyArray(arr, base, n);

    start = clock();

    quickSort(arr, 0, n - 1);

    end = clock();

    timeQS = ((double)(end - start)) / CLOCKS_PER_SEC * 1000000;


    copyArray(arr, base, n);

    start = clock();

    mergeSort(arr, 0, n - 1);

    end = clock();

    timeMS = ((double)(end - start)) / CLOCKS_PER_SEC * 1000000;

    printf("Best Case: QuickSort = %.2f µs, MergeSort = %.2f µs\n", timeQS, timeMS);


    // --- Worst Case (descending for QuickSort)

    fillDescending(base, n);

    copyArray(arr, base, n);

    start = clock();

    quickSort(arr, 0, n - 1);

    end = clock();

    timeQS = ((double)(end - start)) / CLOCKS_PER_SEC * 1000000;


    copyArray(arr, base, n);

    start = clock();

    mergeSort(arr, 0, n - 1);

    end = clock();

    timeMS = ((double)(end - start)) / CLOCKS_PER_SEC * 1000000;

    printf("Worst Case: QuickSort = %.2f µs, MergeSort = %.2f µs\n", timeQS, timeMS);


    // --- Average Case (random)

    fillRandom(base, n);

    copyArray(arr, base, n);

    start = clock();

    quickSort(arr, 0, n - 1);

    end = clock();

    timeQS = ((double)(end - start)) / CLOCKS_PER_SEC * 1000000;


    copyArray(arr, base, n);

    start = clock();

    mergeSort(arr, 0, n - 1);

    end = clock();

    timeMS = ((double)(end - start)) / CLOCKS_PER_SEC * 1000000;

    printf("Average Case: QuickSort = %.2f µs, MergeSort = %.2f µs\n", timeQS, timeMS);


    free(base); free(arr);

}


// ---------------- Main ----------------

int main() {

    srand(time(0));

    testSorts(1000);

    testSorts(5000);

    testSorts(10000);

    return 0;

}

Output:


Comments