#include<stdio.h>
#include<iostream>
using namespace std;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define ElemType int
typedef struct{
ElemType *elem;
int length;
int listsize;
}SqList;
//建顺序表
void InitList_Sq(SqList &L)
{
L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if (!L.elem) cout << "存储分配失败!" << endl;
L.length = 0;
L.listsize = LIST_INIT_SIZE;
}
//在第i位置插入元素e
void ListInsert_Sq(SqList &L, int i, ElemType e)
{
int *newbase;
if (i<1 || i>L.length + 1) cout << "位置错误!" << endl;
if (L.length >= L.listsize)
{
newbase = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT)*sizeof(ElemType));
if (!newbase) cout << "重新分配地址错误!" << endl;
L.elem = newbase;
L.listsize += LISTINCREMENT;
}
int *p, *q;
q = &(L.elem[i - 1]);
for (p = &(L.elem[L.length - 1]); p >= q; --p) //将第i位置及其以后的元素后移一个位置
*(p + 1) = *p;
*q = e;
++L.length;
}
//希尔排序
void ShellInsert(SqList &L, int dk)
{
int i=0, j=0;
int t; //可以理解为临时变量
for (i = dk ; i < L.length;++i) //以加dk后的元素为循环变量,逐个与为加dk的元素比较
if (L.elem[i] < L.elem[i - dk])
{
t = L.elem[i];
for (j = i - dk; j>=0 && t < L.elem[j]; j -= dk) //若元素小于相邻dk距离的元素,则元素前移dk
L.elem[j + dk] = L.elem[j];
L.elem[j + dk] = t; //插入元素
}
}
//打印
void PrintL(SqList &L)
{
int i = 0;
while (i < L.length)
{
cout << L.elem[i] << " ";
i++;
}
cout << endl;
}
void main()
{
SqList L;
int dk;
//创建顺序表L并插入数据
InitList_Sq(L);
ListInsert_Sq(L, 1, 56); ListInsert_Sq(L, 2, 25);
ListInsert_Sq(L, 3, 98); ListInsert_Sq(L, 4, 12);
ListInsert_Sq(L, 5, 78); ListInsert_Sq(L, 6, 88);
ListInsert_Sq(L, 7, 39); ListInsert_Sq(L, 8, 95);
ListInsert_Sq(L, 9, 91); ListInsert_Sq(L, 10, 86);
ListInsert_Sq(L, 11, 80); ListInsert_Sq(L, 12, 99);
cout << "La的元素为:";
PrintL(L);
//dk为3时,输出每一趟的结果
for (dk = 3; dk > 0; --dk)
{
ShellInsert(L, dk);
cout << "dk=" << dk << "第" << 3 - dk + 1 << "趟结果为:";
PrintL(L);
}
//防止运行结果一闪而过
system("pause");
}