参考书目:数据结构与算法分析C++描述(第3版) Mark Allen Weiss
由于希尔排序shell排序和插入排序的联系,故将二者放到一篇文章之中
插入排序
typedef int ElementsType;
//插入排序,升序排序
void InsertionSort(ElementsType A[], int N)
{
ElementsType Temp;
int i, j;
//进行N-1趟遍历
for( i = 1; i < N; ++i )
{
Tmp = A[i];
//寻找插入点,数据依次向后移动
for( j = i; j > 0 && A[j-1] > Temp; --j)
A[j] = A[j-1];
A[j] = Temp;
}
希尔排序shell排序
增量序列采用shell建议的序列:ht=[N/2]和hk=[h(k+1)/2] 每次遍历就是增量为Increment的插入排序。Increment表示shell排序增量序列的取值,初始值为N/2,每次遍历减为上一次的一半直到1
typedef int ElementType;
void ShellSort(ElementsType A[], int N)
{
ElementsType Temp;
int i, j;
int Increment;
for( Increment = N/2; Increment > 0; Increment/=2 )
{
for( i = Increment; i < N; ++i )
{
Temp = A[i];
for( j = i; j >= Increment && A[j-Increment] > Temp; j -= Increment)
A[j] = A[j-Increment];
A[j] = Temp;
}
}
}