数据结构--------------静态表的希尔排序

#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&&LT(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;
}

posted @ 2013-10-14 13:40  smart0326  阅读(232)  评论(0)    收藏  举报