排序的存储结构
typedef int KeyType;
typedef struct
{
KeyType key;
InfoType data;
}RecType;
直接插入排序
void InsertSort(RecType R[],int n)
{
int i,j;RecType tmp;
for(i=1;i<n;i++)
{
if(R[i].key<R[i-1].key) //反序时
{
tmp=R[i];
j=i-1;
do
{
R[j+1]=R[j]; //将关键字大于R[i].key的记录后移
j--;
} while (j>=0 && R[j].key>tem.key);
R[j+1]=tmp; //在R[j+1]出插入R[i]
}
}
}
折半插入排序
void BinInsertSort(RecType R[],int n)
{
int i,j,low,high,mid;
RecType tmp;
for(i=1;i<n;i++)
{
if(R[i].key<R[i-1].key) // 反序时
{ tmp=R[i];
low=0; high=i-1;
while(low<=high) //在R[low..hign]中查找插入的位置
{
mid=(low+high)/2; //取中间位置
if(tmp.key<R[mid].key)
high=mid-1; //插入左半区
else
low=mid+1; //插入右半区
}
for(j=i-1;j>=high+1;j--) //集中进行元素后移
R[j=1]=R[j];
R[high+1]=tmp;
}
}
}
希尔排序
void ShellSort(RecType R[],int n)
{
int i,j,d;
RecType tmp;
d=n/2; 增量置初值
while(d>0)
{
for(i=d;i<n;i++) //对所有组采用直接插入排序
{
tmp=R[i]; //对相隔为d个位置的一组采用直接插入排序
j=i-d;
while(j>=0 && tmp.key<R[j].key)
{
R[j+d]=R[j];
j=j-d;
}
R[j+d]=tmp;
}
d=d/2;
}
}