aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--makefile8
-rw-r--r--shellsort.c64
3 files changed, 71 insertions, 3 deletions
diff --git a/.gitignore b/.gitignore
index 4d1c44f..08b10b0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,4 +17,4 @@ stack2
17tags 17tags
18tree 18tree
19insertsort 19insertsort
20 20shellsort
diff --git a/makefile b/makefile
index 6bbb98a..14f5db3 100644
--- a/makefile
+++ b/makefile
@@ -1,8 +1,9 @@
1.PHONY: all clean 1.PHONY: all clean
2 2
3CFLAGS=-Wall -Werror -Wextra -Wno-unused-function -Wsign-conversion -pedantic -std=c99 -g 3CFLAGS=-Wall -Werror -Wextra -Wno-unused-function -Wsign-conversion -pedantic -std=c99 -g
4BINS=list list-tail-node dlist stack stack2 queue ringbuff hashtab tree avl heap quicksort allocator rb deque arraylist insertsort shellsort
4 5
5all: list list-tail-node dlist stack stack2 queue ringbuff hashtab tree avl heap quicksort allocator rb deque arraylist insertsort 6all: $(BINS)
6 7
7list: list.c util.h 8list: list.c util.h
8 cc $(CFLAGS) $< -o $@ 9 cc $(CFLAGS) $< -o $@
@@ -55,6 +56,9 @@ arraylist: arraylist.c util.h
55insertsort: insertsort.c util.h 56insertsort: insertsort.c util.h
56 cc $(CFLAGS) $< -o $@ 57 cc $(CFLAGS) $< -o $@
57 58
59shellsort: shellsort.c util.h
60 cc $(CFLAGS) $< -o $@
61
58clean: 62clean:
59 rm -f list list-tail-node dlist stack stack2 queue ringbuff hashtab tree avl heap quicksort allocator rb deque arraylist insertsort 63 rm -f $(BINS)
60 64
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}