cmake_minimum_required(VERSION 3.12) | |||||
project(sorts C) | |||||
set(CMAKE_C_STANDARD 99) | |||||
add_executable(sorts main.c sorts.c) | |||||
add_executable(test_sorts test.c sorts.c) |
#include <stdio.h> | |||||
#include <time.h> | |||||
#include <bits/time.h> | |||||
#include <stdlib.h> | |||||
#include "sorts.h" | |||||
void init_arr(double* arr, size_t n) { | |||||
for (size_t i = 0; i < n; i++ ){ | |||||
arr[i] = (double) (rand() % (2 << 10)) / 42; | |||||
} | |||||
} | |||||
void do_test(size_t n) { | |||||
double arr[n]; | |||||
long start = clock() * 1000 / CLOCKS_PER_SEC; | |||||
long elapsed; | |||||
size_t sorts = 0; | |||||
srand(time(0)); | |||||
do { | |||||
init_arr(arr, n); | |||||
quicksort(arr, n); | |||||
elapsed = clock() * 1000 / CLOCKS_PER_SEC - start; | |||||
sorts++; | |||||
} while (elapsed < 2500); | |||||
printf("Quicksort:\n%lu sorts done in %ld ms, avg: %.5f ms\n", sorts, elapsed, (double) elapsed / sorts); | |||||
start = clock() * 1000 / CLOCKS_PER_SEC; | |||||
sorts = 0; | |||||
do { | |||||
init_arr(arr, n); | |||||
shellsort(arr, n); | |||||
elapsed = clock() * 1000 / CLOCKS_PER_SEC - start; | |||||
sorts++; | |||||
} while (elapsed < 2500); | |||||
printf("Shellsort:\n%lu sorts done in %ld ms, avg: %.5f ms\n", sorts, elapsed, (double) elapsed / sorts); | |||||
start = clock() * 1000 / CLOCKS_PER_SEC; | |||||
sorts = 0; | |||||
do { | |||||
init_arr(arr, n); | |||||
selectionsort(arr, n); | |||||
elapsed = clock() * 1000 / CLOCKS_PER_SEC - start; | |||||
sorts++; | |||||
} while (elapsed < 2500); | |||||
printf("Selection sort:\n%lu sorts done in %ld ms, avg: %.5f ms\n", sorts, elapsed, (double) elapsed / sorts); | |||||
} | |||||
int main() { | |||||
printf("Doing test for n = 2 << 9\n"); | |||||
do_test(2 << 9); | |||||
printf("\n"); | |||||
printf("Doing test for n = 2 << 12\n"); | |||||
do_test(2 << 12); | |||||
printf("\n"); | |||||
printf("Doing test for n = 2 << 15\n"); | |||||
do_test(2 << 15); | |||||
printf("\n"); | |||||
} |
// | |||||
// Created by red on 01/12/19. | |||||
// | |||||
#include "sorts.h" | |||||
#include <stdio.h> | |||||
#include <stddef.h> | |||||
unsigned long partition(double* arr, unsigned long n) { | |||||
double pivot = arr[n-1]; | |||||
unsigned long i = 0; | |||||
for (unsigned long j = 0; j < n-1; j++) { | |||||
if (arr[j] < pivot) { | |||||
double tmp = arr[i]; | |||||
arr[i] = arr[j]; | |||||
arr[j] = tmp; | |||||
i++; | |||||
} | |||||
} | |||||
double tmp = arr[i]; | |||||
arr[i] = arr[n-1]; | |||||
arr[n-1] = tmp; | |||||
return i; | |||||
} | |||||
//quicksort the array pointed at by arr, containing n elements in total. | |||||
void quicksort(double* arr, unsigned long n) { | |||||
if (n < 2) { return; } | |||||
unsigned long pivot = partition(arr, n); | |||||
quicksort(arr, pivot); | |||||
quicksort(arr+pivot+1, n-pivot-1); | |||||
} | |||||
//Ciura (2001), A102549 | |||||
static size_t const gaps[8] = {701, 301, 132, 57, 23, 10, 4, 1}; | |||||
static size_t const gaps_num = 8; | |||||
void shellsort(double* arr, size_t n) { | |||||
//literally the example code from wikipedia i'm lazy | |||||
for (size_t i = 0; i < gaps_num; i++){ | |||||
size_t gap = gaps[i]; | |||||
for (size_t j = gap; j < n; j++) { | |||||
double tmp = arr[j]; | |||||
size_t k; | |||||
for (k = j; k >= gap && arr[k - gap] > tmp; k -= gap) { | |||||
arr[k] = arr[k-gap]; | |||||
} | |||||
arr[k] = tmp; | |||||
} | |||||
} | |||||
}; | |||||
void selectionsort(double* arr, size_t n) { | |||||
for (size_t i = 0; i < n; i++) { | |||||
size_t min = i; | |||||
for (size_t j = i+1; j < n; j++) { | |||||
if (arr[j] < arr[min]) {min = j;} | |||||
} | |||||
if (min != i) { | |||||
double tmp = arr[i]; | |||||
arr[i] = arr[min]; | |||||
arr[min] = tmp; | |||||
} | |||||
} | |||||
} |
// | |||||
// Created by red on 01/12/19. | |||||
// | |||||
#ifndef SORTS_SORTS_H | |||||
#define SORTS_SORTS_H | |||||
#include <stddef.h> | |||||
void quicksort(double* arr, size_t n); | |||||
void shellsort(double* arr, size_t n); | |||||
void selectionsort(double* arr, size_t n); | |||||
#endif //SORTS_SORTS_H |
// | |||||
// Created by red on 01/12/19. | |||||
// | |||||
#include <stdio.h> | |||||
#include <stdlib.h> | |||||
#include <time.h> | |||||
#include "sorts.h" | |||||
void print_elements(double* arr, size_t n) { | |||||
printf("Elements of array:\n"); | |||||
for (size_t i = 0; i < n; i++) { | |||||
printf("%.4f ", arr[i]); | |||||
} | |||||
printf("\n"); | |||||
} | |||||
void init_arr(double* arr, size_t n) { | |||||
for (size_t i = 0; i < n; i++ ){ | |||||
arr[i] = (double) (rand() % (2 << 10)) / 42; | |||||
} | |||||
} | |||||
int main() { | |||||
srand(time(0)); | |||||
puts("Testing quicksort..."); | |||||
double* arr = calloc(10, sizeof(double)); | |||||
init_arr(arr, 10); | |||||
print_elements(arr, 10); | |||||
quicksort(arr, 10); | |||||
print_elements(arr, 10); | |||||
puts("Sorted!"); | |||||
puts("Testing shellsort..."); | |||||
init_arr(arr, 10); | |||||
print_elements(arr, 10); | |||||
shellsort(arr, 10); | |||||
print_elements(arr, 10); | |||||
puts("Sorted!"); | |||||
puts("Testing selection sort..."); | |||||
init_arr(arr, 10); | |||||
print_elements(arr, 10); | |||||
selectionsort(arr, 10); | |||||
print_elements(arr, 10); | |||||
puts("Sorted!"); | |||||
} |