Browse Source

initial commit

master
red 4 years ago
commit
361dadcf13
5 changed files with 192 additions and 0 deletions
  1. +7
    -0
      CMakeLists.txt
  2. +58
    -0
      main.c
  3. +67
    -0
      sorts.c
  4. +13
    -0
      sorts.h
  5. +47
    -0
      test.c

+ 7
- 0
CMakeLists.txt View File

@@ -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)

+ 58
- 0
main.c View File

@@ -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");
}

+ 67
- 0
sorts.c View File

@@ -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;
}
}
}

+ 13
- 0
sorts.h View File

@@ -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

+ 47
- 0
test.c View File

@@ -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!");
}

Loading…
Cancel
Save