#define LT(a,b) ((a)< (b))
#define EQ(a,b) ((a)==(b))
#define LQ(a,b) ((a)<=(b))
typedef struct ElemType
{//表中元素结构
int key;
char name[20];
}ElemType;
typedef struct SSTable
{//静态表结构
ElemType *elem;
int length;
}SSTable;
ElemType r[20];//全局变量,用于传值给表元素
void Create_SqTable(SSTable &T,int n)
{//创建顺序表
T.elem=new ElemType [n];
for(int i=1;i<=n;i++)//静态表第一个元素不用
T.elem[i]=r[i-1];
T.length=n;
}
void InPut(SSTable &T)
{//顺序表的录入
char c='#';
static int n=0;
while(c!='!')
{
cout<<"元素关键字:";
cin>>r[n].key;
cout<<"元素名字:";
cin>>r[n].name;
n++;
c=getchar();
}
Create_SqTable(T,n);
}
//思想:
//先将整个序列分成若干个子序列,再对子序列进行直接插入排序
//待到子序列基本有序,则对全体记录进行一次直拉插入排序
void ShellInsert(SSTable &L,int dk)
{//dk是前后记录的增量
int j;
for(int i=dk+1;i<=L.length;++i)
if(LT(L.elem[i].key,L.elem[i-dk].key))
{
L.elem[0]=L.elem[i];
for(j=i-dk;j>0&<(L.elem[0].key,L.elem[j].key);j-=dk)
L.elem[j+dk]=L.elem[j];
L.elem[j+dk]=L.elem[0];
}
}
void ShellSort(SSTable &L,int dlta[],int t)
{//对t个记录进行希排序
for(int k=0;k<t;k++)
ShellInsert(L,dlta[k]);
}
void Print(SSTable L)
{
for(int i=1;i<=L.length;i++)
cout<<L.elem[i].key<<" "<<L.elem[i].name<<endl;
}