实现希尔排序算法。

#include <iostream>
using namespace std;
#define MAXSIZE 11
typedef int DataType;
typedef struct
{
    DataType data[MAXSIZE];//用一位数组类描述数据存储
    int SeqLength;
}SeqList;
void inputArray(SeqList &L)
{
    cout << "(";
    for (int i = 1; i <=L.SeqLength; i++)
    {
        cout << L.data[i] << "   ";
    }
    cout << ")";
}
void Define_SeqList(SeqList *L, int n)
{
    cout << "请依次输入顺序表中要存储的元素" << endl;
    L->data[0] = 0;
    for (int i = 1; i <= n; i++)
    {
        cin >> L->data[i];//输入数组元素
        L->SeqLength++;
    }
}
SeqList *Init_SeqList()//顺序表的初始化算法,将顺序表清空
{
    SeqList *L;
    L = new SeqList;
    L->SeqLength = 0; /*长度置为-1*/
    return L;
}
void shellInsert(SeqList &L, int dk,int n)
{
    //对顺序表L作一趟希尔插入排序
    //1。前后记录位置的增量是dk,而不是1
    //2.r[0]只是暂存单元,不是哨兵
    for (int i = dk + 1; i <=n; i++)
    {
        if (L.data[i]<L.data[i-dk])
        {
            L.data[0] = L.data[i];
            for (int j = i-dk; j > 0 && (L.data[0]<L.data[j]); j -= dk)
            {
                L.data[j + dk] = L.data[j];//记录后移,查找插入位置
                L.data[j] = L.data[0];//插入
            }
        }
    }
    inputArray(L);

}
void ShellSort(SeqList &L, int dlta[], int t,int n)//按增量序列dlta[]对顺序表L作希尔排序
{
    for (int k = 0; k < t; ++k)
    {
        cout << endl;
        cout << "第"<<k +1<<"次"<<endl;
        shellInsert(L, dlta[k],n);//一趟增量为dlta[k]的插入排序
    }
}

int main()
{
    SeqList *L;
    L = Init_SeqList();
    cout << "请输入数组元素的个数(小于15)";
    int n;
    cin >> n;
    Define_SeqList(L, n);
    inputArray(*L);
    cout << endl;
    int dlta[3] = { 5, 3, 1 };
    ShellSort(*L, dlta, 3,n);    
}

猜你喜欢

转载自blog.csdn.net/Thora_yu/article/details/78867554