//Shell排序是对插入排序的一种改进,在最坏的情况下时间复杂度为O(n2),在最好的情况下为O(n);当插入的数据基本有序的时候插入的效率时最高的;
//Shell的基本思想是先将整个要排序的序列分成若干个子序列,分别对各个子序列进行直接插入排序,当各个子序列基本有序时,再对子序列进行一次插入排序;
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void shellinsert(int array[],int number,int incr);
void shellsort(int array[],int number,int t);
int main()
{
int i,count;
printf("please input the number of the data:\n");
scanf("%d",&count);
int array[count];
printf("please input the number:\n");
for(i=0;i<count;i++)
{
scanf("%d",&array[i]);
}
printf("before sort:\n");
for(i=0;i<count;i++)
{
printf("%d ",array[i]);
}
printf("\n");
shellsort(array,count,3);
printf("after sort:\n");
for(i=0;i<count;i++)
printf("%d ",array[i]);
printf("\n");
return 0;
}
void shellinsert(int array[],int number,int inc)
{
int i,j;
for(i=inc;i<number;i++)
{
int temp=array[i];
for(j=i-inc;j>=0 && temp<array[j];j-=inc)
{
array[j+inc]=array[j];
}
array[j+inc]=temp;
}
printf("%d\n",i);
}
void shellsort(int array[],int number,int t)
{
int k;//k表示第几趟排序,t表示一共排序几趟;
int incr[3]={7,3,1};
for(k=0;k<t;k++)
{
// incr[k]=pow(2,t-k)-1;
shellinsert(array,number,incr[k]);
}
}
#include <iostream>
using namespace std;
void shellinsert(int a[],int n,int incr);
void shell(int a[],int n,int inc[],int t);
int main()
{
int number;
cout<<"请输入你的数组的个数:"<<endl;
cin>>number;
int a[number]; int inc[]={7,3,1};
cout<<"请输入你的数据:"<<endl;
for(int i=0;i<number;i++)
{
cin>>a[i];
}
cout<<"请确认你输入的数据:"<<endl;
for(int i=0;i<number;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
cout<<endl;
shell(a,number,inc,3);
cout<<"排序后的顺序是:"<<endl;
for(int i=0;i<number;i++)
{
cout<<a[i]<<" ";
}
}
void shellinsert(int a[],int number, int zen)
{
for(int i=zen;i<number;i++)
{
int e=a[i];
int j;
for(j=i-zen;j>=0&&e<a[j];j-=zen)
{
a[j+zen]=a[j];
}
a[j+zen]=e;
}
}
void shell(int a[],int number,int inc[],int t)
{
for(int k=0;k<t;k++)
{
shellinsert(a,number,inc[k]);
}
}