#include <iostream>
template <class elem>
void swap(elem a[], int p1, int p2)
{
elem tmp = a[p1];
a[p1] = a[p2];
a[p2] = tmp;
}
template <class elem>
void print(elem a[], int length)
{
for (int i = 0; i < length; i++)
std::cout << a[i] << ' ';
std::cout << std::endl;
}
template <class elem>
void insert_sort(elem a[], int length, int increment)
{
for (int i = increment; i < length; i += increment)
for (int j = i; j >= increment; j -= increment)
if (a[j] < a[j-increment])
swap(a, j, j - increment);
}
template <class elem>
void shell_sort(elem a[], int length)
{
for (int i = length/2; i > 2; i/= 2)
for (int j = 0; j < i; j++)
insert_sort(&a[j], length - j, i);
insert_sort(a, length, 1);
}
int main(void)
{
int a[] = {42, 20, 17, 13, 28, 14, 23, 15};
print(a, 8);
shell_sort(a, 8);
print(a, 8);
system("pause");
return 0;
}