/***********直接插入排序***************/
void InsertSort ( Elem R[ ], int n)
{ // 对记录序列R[1..n]作直接插入排序。
for ( i=2; i<=n; ++i )
{
if( R[i] <= R[i-1] )
{ R[0] = R[i]; // 复制为监视哨
R[i] = R[i-1]
for ( j=i-2; R[0] < R[j]; --j )
R[j+1] = R[j]; // 记录后移
R[j+1] = R[0]; // 插入到正确位置
} //if
}
} // InsertSort
/***********折半插入排序***************/
void BiInsertSort (Elem R[ ], int n)
{ // 对记录序列R[1..n]作折半插入排序。
for ( i=2; i<=n; ++i )
{
R[0] = R[i]; // 将R[i]暂存到R[0]
low = 1; high = i-1;
while (low<=high)
{ //在R[low..high]中折半查找插入的位置
m = (low+high)/2; // 折半
if (R[0] < R[m])
high = m-1; // 插入点在低半区
else low = m+1; // 插入点在高半区
} //while
for ( j=i-1; j>=high+1; --j )
R[j+1] = R[j]; // 记录后移
R[high+1] = R[0]; // 插入
} // BinsertSort
/***********希尔插入排序***************/
void ShellInsert ( Elem R[ ], int dk )
{ // 对待排序列R作一趟希尔插入排序。本算法对直接插入算法作了以下
// 修改:1. 前后记录位置的增量是dk,而不是1;
// 2. r[0]只是暂存单元,不是哨兵。当j<=0时,插入位置已找到。
for ( i=dk+1; i<=n; ++i )
if ( R[i]< R[i-dk])
{ // 需将R[i]插入有序增量子表
R[0] = R[i]; // 暂存在R[0]
for (j=i-dk; j>0 && R[0]< R[j]; j-=dk)
R[j+dk] = R[j]; // 记录后移,查找插入位置
R[j+dk] = R[0]; // 插入
}
} // ShellInsert
void ShellSort (Elem R[ ], int d [ ], int t)
{ // 按增量序列d [0..t-1]对顺序表L作希尔排序。
for (k=0; k<t; ++t)
ShellInsert(R, d[k]); // 一趟增量为d [k]的插入排序
} // ShellSort