#include <stdio.h>
while(step<len) step = step*3 + 1;//1 4 13 40 ...
while(step >= 1) {
int j;
for(j=step;j<len;j+=step) {
int i;
for(i=j;i>=step && a[i]<a[i-step];i-=step) {
int t = a[i];
a[i] = a[i-step];
a[i-step] = t;
}
}
step = step/3;
}
}
void print(int* a,int len) {
int i = 0;
for(;i<len;i++) {
fprintf(stdout,"%d ",a[i]);
}
printf("\n");
}
int main(void) {
int a[] = {3,2,33,46,1,2,31,12,23,4,31251,123,1,23,13,14,123,4,1234};
int len = sizeof(a)/sizeof(int);
print(a,len);
shell(a,len);
print(a,len);
return 0;
}
void shell(int* a,int len) {
int step = 1;while(step<len) step = step*3 + 1;//1 4 13 40 ...
while(step >= 1) {
int j;
for(j=step;j<len;j+=step) {
int i;
for(i=j;i>=step && a[i]<a[i-step];i-=step) {
int t = a[i];
a[i] = a[i-step];
a[i-step] = t;
}
}
step = step/3;
}
}
void print(int* a,int len) {
int i = 0;
for(;i<len;i++) {
fprintf(stdout,"%d ",a[i]);
}
printf("\n");
}
int main(void) {
int a[] = {3,2,33,46,1,2,31,12,23,4,31251,123,1,23,13,14,123,4,1234};
int len = sizeof(a)/sizeof(int);
print(a,len);
shell(a,len);
print(a,len);
return 0;
}