#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);
}
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);
}