问题:
对待排序的数组r[1..n]中的元素进行直接插入排序,得到一个有序的(从小到大)的数组r[1..n]。
算法思想:
1、第一趟取增量d1(d1<n)把全部记录分为d1个组,所有间隔为d1的记录分在同一组,在各个组中进行直接插入排序。
2、第二趟取增量d2(d2<d1),重复上述的分组和排序。
3、以此类推,直到所取的增量dt=1(dt<dt_1<d_t-2<......<d2<d1),所有记录在同一组中进行直接插入排序为止。
图解:
代码:
#include<iostream>
using namespace std;
#define MAXSIZE 20//顺序表的最大长度
typedef int KeyType;//定义关键字类型为整型
typedef int InfoType;
typedef struct
{
KeyType key;//关键字项
InfoType otherinfo;//其他数据项
}RedType;
typedef struct
{
RedType r[MAXSIZE+1];//r[0]闲置或做哨兵单元
int length;//顺序表的长度
}SqList;//顺序表类型
void ShellInsert(SqList &L,int dk)//对顺序表L做一趟增量是dk的希尔插入排序
{
for(int i=dk+1;i<=L.length;i++