#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int prime[100];
int vis[10000];
void IsPrime(){
int i, j, cnt=0;
prime[cnt++]=1;
for(i=2; i<=100; i++){
if(!vis[i]){
for(j=i+i; j<=100; j+=i){
vis[j]=1;
}
prime[cnt++]=i;
}
}
}
void print(int *a, int len){
int i;
for(i=0; i<len; i++)
printf("%d%c", a[i], i==len-1?'\n':' ');
}
void shell(int *a, int len){
int step;
int i, k;
for(k=1; k<=100; k++)
if(prime[k]>=len/2) break;
for(step=prime[k--]; step>=1; step=prime[k--]){
for(i=0; i<len&&i+step<len; i++){
int temp=a[i+step];
int r=i+step, l=i;
while(l>=0){
if(a[l]<a[r]) break;
a[r]=a[l];
a[l]=temp;
r=l;
l--;
}
}
//print(a, len);
}
return;
}
int a[1000];
int main(){
int n;
IsPrime();
while(scanf("%d", &n), n){
int i;
for(i=0; i<n; i++){
scanf("%d", &a[i]);
}
shell(a, n);
print(a, n);
}
return 0;
}
shell sort
最新推荐文章于 2020-07-01 07:46:35 发布