aboutsummaryrefslogtreecommitdiff
path: root/ssort.c
blob: 4abea675940f8619baa2a8637c35d5fd32432fda (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdio.h>

#define ARR_SIZE(X) (sizeof(X)/sizeof(X[0]))

void print_array(int array[], int len);
void shell_sort(int array[], int len);
void swap(int *to, int *from);

int main(void)
{
	int array[] = {4, 2, 1, 7, 8, 9, 6, 0, 3, 5};

	print_array(array, sizeof(array)/sizeof(int));
	shell_sort(array, sizeof(array)/sizeof(array[0]));
	print_array(array, sizeof(array)/sizeof(int));

	return 0;
}

void print_array(int array[], int len)
{
	while (len--)
		printf((!len) ? "%d\n" : "%d, ", *array++);
}

void shell_sort(int array[], int len)
{
	int gap, i, j;

	for (gap = len/2; gap > 0; gap /= 2)
		for (i = gap; i < len; ++i)
			for (j = i - gap; j >= 0 && array[j] >= array[j+gap];
				j -= gap)
				swap(array + j, array + j + gap);
}



void swap(int *to, int *from)
{
	int buff = *to;

	*to = *from;
	*from = buff;
}