#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef int ElemType;
typedef struct{
ElemType *elem;
int TableLen;
}SSTable;void ST_Init(SSTable &ST,int len)
{
ST.TableLen=len+;
ST.elem=(ElemType *)malloc(sizeof(ElemType)*ST.TableLen);
int i;
srand(time(NULL));
for(i=;i<ST.TableLen;i++)
{
ST.elem[i]=rand()%;
}
}
void ST_print(SSTable ST)
{
for(int i=;i<ST.TableLen;i++)
{
printf("%3d",ST.elem[i]);
}
}
//插入排序
/*void InsertSort(ElemType A[],int n)
{
int i ,j;
for(i=2;i<=n;i++)
{
if(A[i]<A[i-1])
{
A[0]=A[i];
for(j=i-1;A[0]<A[j];--j)
A[j+1]=A[j];
A[j+1]=A[0];
}
}
} */
//折半查找
/*void MidInertSort(ElemType A[],int n)
{
int i,j,low,high,mid;
for(i=2;i<=n;i++)
{
A[0]=A[i];
low=1;
high=i-1;
while(low<=high)//先通过二分查找找到待插入法人位置
{
mid=(low+high)/2;
if(A[mid]>A[0])
high=mid-1;
else
low=mid+1;
}
for(j=i-1;j>=high+1;--j)
A[j+1]=A[j];
A[high+1]=A[0];
}
}*/
//希尔排序
void ShellSort(ElemType A[],int n)
{
int dk,i,j;
for(dk=n/;dk>=;dk=dk/)//步长变化
{
for(i=dk+;i<n;++i)//以dk为步长进行插入排序
{
if(A[i]<A[i-dk])
{
A[]=A[i];
for(j=i-dk;j>&&A[]<A[j];j-=dk)
A[j+dk]=A[j];
A[j+dk]=A[];
}
}
}
}
int main()
{
SSTable ST;
ST_Init(ST,);
ST_print(ST);
// InsertSort(ST.elem,10);
//MidInertSort(ST.elem,10);
ShellSort(ST.elem,);
ST_print(ST);
system("pause") ;
}