Running Time of Quicksort

  • + 0 comments

    Time Complexity: O(n^2) for insertionsort. O(nlog(n)) for quicksort.

    Space Complexity: O(n)

    #include <assert.h>
    #include <ctype.h>
    #include <limits.h>
    #include <math.h>
    #include <stdbool.h>
    #include <stddef.h>
    #include <stdint.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char* readline();
    char* ltrim(char*);
    char* rtrim(char*);
    char** split_string(char*);
    
    int parse_int(char*);
    
    void printf_arr(int* arr, int n){
        for (int i= 0; i<n; i++){
            printf("%d ", arr[i]);
        }
        printf("\n");
    }
    
    
    void swap(int* a, int* b, int* count){
        (*count ) ++;
        int temp = *a;
        *a = *b;
        *b = temp;
    }
    
    int insertionSort2(int n, int arr_count, int* arr, int* count) {
        for (int i = 1; i<arr_count; i++){
            int j = i;
            while (j-1 >= 0 && arr[j] < arr[j-1]){
                swap(&arr[j], &arr[j-1], count);
                j --;
            }
        }
        return *count;
    }
    
    
    int partition(int l, int r, int* arr, int* count){
        int pivot = arr[r];
        int i = l-1;
        for (int j = l; j<r; j++){
            if (arr[j] < pivot){
                i ++;
                swap(&arr[i], &arr[j], count);
            }
        }
        i ++;
        swap(&arr[i], &arr[r], count);
        return i;
    }
    
    int quicksort(int l, int r, int* arr, int* count){
        if (l < r){
            int idx = partition(l, r, arr, count);
            quicksort(l, idx-1, arr, count);
            quicksort(idx+1, r, arr, count);
        }
        return *count;
    }
    
    
    int main()
    {
        int insertion_sort_count = 0;
        int quicksort_count = 0;
        int n = parse_int(ltrim(rtrim(readline())));
    
        char** arr_temp = split_string(rtrim(readline()));
    
        int* arr_1 = malloc(n * sizeof(int));
        int* arr_2 = malloc(n * sizeof(int));
    
        
        for (int i = 0; i < n; i++) {
            int arr_item = parse_int(*(arr_temp + i));
    
            *(arr_1 + i) = arr_item;
            *(arr_2 + i) = arr_item;
    
        }
    
        insertion_sort_count = insertionSort2(n, n, arr_1, &insertion_sort_count);
        quicksort_count = quicksort(0, n-1, arr_2, &quicksort_count);
        printf("%d\n", insertion_sort_count-quicksort_count);
        return 0;
    }
    
    char* readline() {
        size_t alloc_length = 1024;
        size_t data_length = 0;
    
        char* data = malloc(alloc_length);
    
        while (true) {
            char* cursor = data + data_length;
            char* line = fgets(cursor, alloc_length - data_length, stdin);
    
            if (!line) {
                break;
            }
    
            data_length += strlen(cursor);
    
            if (data_length < alloc_length - 1 || data[data_length - 1] == '\n') {
                break;
            }
    
            alloc_length <<= 1;
    
            data = realloc(data, alloc_length);
    
            if (!data) {
                data = '\0';
    
                break;
            }
        }
    
        if (data[data_length - 1] == '\n') {
            data[data_length - 1] = '\0';
    
            data = realloc(data, data_length);
    
            if (!data) {
                data = '\0';
            }
        } else {
            data = realloc(data, data_length + 1);
    
            if (!data) {
                data = '\0';
            } else {
                data[data_length] = '\0';
            }
        }
    
        return data;
    }
    
    char* ltrim(char* str) {
        if (!str) {
            return '\0';
        }
    
        if (!*str) {
            return str;
        }
    
        while (*str != '\0' && isspace(*str)) {
            str++;
        }
    
        return str;
    }
    
    char* rtrim(char* str) {
        if (!str) {
            return '\0';
        }
    
        if (!*str) {
            return str;
        }
    
        char* end = str + strlen(str) - 1;
    
        while (end >= str && isspace(*end)) {
            end--;
        }
    
        *(end + 1) = '\0';
    
        return str;
    }
    
    char** split_string(char* str) {
        char** splits = NULL;
        char* token = strtok(str, " ");
    
        int spaces = 0;
    
        while (token) {
            splits = realloc(splits, sizeof(char*) * ++spaces);
    
            if (!splits) {
                return splits;
            }
    
            splits[spaces - 1] = token;
    
            token = strtok(NULL, " ");
        }
    
        return splits;
    }
    
    int parse_int(char* str) {
        char* endptr;
        int value = strtol(str, &endptr, 10);
    
        if (endptr == str || *endptr != '\0') {
            exit(EXIT_FAILURE);
        }
    
        return value;
    }