直接来代码:
// EX_EXAM.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
/*包含头文件*/
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50
typedef int KeyType;
typedef struct /*数据元素类型定义*/
{
KeyType key;/*关键字*/
}DataType;
typedef struct /*顺序表类型定义*/
{
DataType data[MaxSize];
int length;
}SqList;
void InitSeqList(SqList *L,DataType a[],int n);
void ShellInsert(SqList *L,int c);
void ShellInsertSort(SqList *L,int delta[],int m);
void DispList(SqList L,int n);
void ShellInsert(SqList *L,int c)
/*对顺序表L进行一次希尔排序,delta是增量*/
{
int i,j;
DataType t;
for (i=1;i<=L->length-c;i=i+c)
{
if (L->data[i+c].key<L->data[i].key)
{
t=L->data[i+c];
for (j=i;j>0&&t.key<L->data[j].key;j=j-c)
{
L->data[i+c]=L->data[i];//移动
}
L->data[j+c]=t;
}
}
}
void ShellInsertSort(SqList *L,int delta[],int m)
/*希尔排序,每次调用算法ShellInsert,delta是存放增量的数组*/
{
int i;
for (i=0;i<m;i++)
{
ShellInsert(L,delta[i]);
}
}
void InitSeqList(SqList *L,DataType a[],int n)
/*顺序表的初始化*/
{
int i;
for(i=1;i<=n;i++)
{
L->data[i]=a[i-1];
}
L->length=n;
}
void DispList(SqList L,int n)
/*输出表中的元素*/
{
int i;
for(i=1;i<=n;i++)
printf("%4d",L.data[i].key);
printf("\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
DataType a[]={56,22,67,32,59,12,89,26,48,37};
int delta[]={5,3,1};
int i,n=10,m=3;
SqList L;
/*希尔排序*/
InitSeqList(&L,a,n);
printf("排序前:");
DispList(L,n);
ShellInsertSort(&L,delta,m);
printf("希尔排序结果:");
DispList(L,n);
return 0;
}