aboutsummaryrefslogtreecommitdiff
path: root/shellsort.c
diff options
context:
space:
mode:
authorThomas Schmucker <ts@its1.de>2022-01-01 12:27:32 +0100
committerThomas Schmucker <ts@its1.de>2022-01-01 12:27:32 +0100
commit20ad66e839dbc632b844f1c03137efa1a457f5fd (patch)
treeed06b6c36f174249f7a9d0793baac0f07c1c8644 /shellsort.c
parent498b794ce5bae04495d916380927e9be23591e49 (diff)
downloaddata-structures-20ad66e839dbc632b844f1c03137efa1a457f5fd.tar.gz
data-structures-20ad66e839dbc632b844f1c03137efa1a457f5fd.tar.bz2
data-structures-20ad66e839dbc632b844f1c03137efa1a457f5fd.zip
feat: implement shellsort
Diffstat (limited to 'shellsort.c')
-rw-r--r--shellsort.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/shellsort.c b/shellsort.c
new file mode 100644
index 0000000..b19f547
--- /dev/null
+++ b/shellsort.c
@@ -0,0 +1,64 @@
1#include <stdio.h>
2#include <stdlib.h>
3#include <time.h>
4
5#include "util.h"
6
7typedef int T;
8
9void
10shellsort(T a[], size_t n)
11{
12 //static const size_t gaps[] = { 701, 301, 132, 57, 23, 10, 4, 1 };
13
14 // Wikipedia:
15 //static const size_t gaps[] = { 2147483647, 1131376761, 410151271, 157840433, 58548857, 21521774, 8810089, 3501671, 1355339, 543749, 213331, 84801, 27901, 11969, 4711, 1968, 815, 271, 111, 41, 13, 4, 1 };
16
17 // https://www.cs.princeton.edu/~rs/shell/paperF.pdf
18 static const size_t gaps[] = { 1391376, 463792, 198768, 86961, 33936, 13776, 4592, 1968, 861, 336, 112, 48, 21, 7, 3, 1 };
19
20 for ( size_t k = 0; k < NELEM(gaps); ++k ) {
21 const size_t gap = gaps[k];
22
23 for ( size_t i = gap; i < n; i++ ) {
24 size_t j = i;
25 T temp = a[i];
26
27 for ( ; j >= gap && a[j - gap] > temp; j -= gap )
28 a[j] = a[j - gap];
29
30 a[j] = temp;
31 }
32 }
33}
34
35static void
36test(T a[], size_t n)
37{
38 for ( size_t i = 1; i < n; ++i ) {
39 if ( a[i - 1] > a[i] ) {
40 fprintf(stderr, "Error\n");
41 exit(EXIT_FAILURE);
42 }
43 }
44}
45
46int
47main(void)
48{
49 T a[1000000];
50
51 srand(time(NULL));
52 for ( size_t i = 0; i != NELEM(a); ++i )
53 a[i] = rand() % 1000;
54
55 clock_t start = clock();
56 shellsort(a, NELEM(a));
57 clock_t end = clock();
58
59 test(a, NELEM(a));
60
61 printf("duration: %.3f sec\n", ((double) (end - start)) / CLOCKS_PER_SEC);
62
63 return EXIT_SUCCESS;
64}