@@ -0,0 +1,7 @@ | |||
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) |
@@ -0,0 +1,58 @@ | |||
#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"); | |||
} |
@@ -0,0 +1,67 @@ | |||
// | |||
// 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; | |||
} | |||
} | |||
} |
@@ -0,0 +1,13 @@ | |||
// | |||
// 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 |
@@ -0,0 +1,47 @@ | |||
// | |||
// 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!"); | |||
} |