数据结构之希尔排序图文详解及代码(C++实现)

橙三吉。 提交于 2019-12-02 06:44:48

问题:

对待排序的数组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++)
    if(L.r[i].key<L.r[i-dk].key)//需将L.r[i]插入有序增量子表
    {
        int j;
        L.r[0]=L.r[i];//暂存在L.r[0]
        for(j=i-dk;j>0&&L.r[0].key<L.r[j].key;j-=dk)
            L.r[j+dk]=L.r[j];//记录后移,直接找到插入位置
        L.r[j+dk]=L.r[0];//将r[0]即原r[i],插入到正确的位置
    }//if
}

void ShellSort(SqList &L,int dt[],int t)//按增量序列dt[0,t-1]对顺序表L做t趟希尔排序
{
    for(int k=0;k<t;k++)
        ShellInsert(L,dt[k]);
}

int main()
{
    SqList L;
    int dt[3]={5,3,1};
    for(int i=1;i<=10;i++)
        L.r[i].key=11-i;
    L.length=10;
    for(int i=1;i<=L.length;i++)
        cout<<L.r[i].key<<" ";
        cout<<endl;
    ShellSort(L,dt,3);
    for(int i=1;i<=L.length;i++)
        cout<<L.r[i].key<<" ";
        cout<<endl;
    return 0;
}

运行结果:

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!