希尔排序实验报告.docx
《希尔排序实验报告.docx》由会员分享,可在线阅读,更多相关《希尔排序实验报告.docx(9页珍藏版)》请在冰豆网上搜索。
希尔排序实验报告
数据结构实验报告(实验五)
实验人:
颜建学
班级:
4101090703
实验时间:
6.8
实验学时:
2
实验地点:
260
实验题目:
排序
实验目的:
1.掌握常规的几种排序方法:
插入排序,选择排序,交换排序
2.了解各种排序方法的优劣适应数据,稳定性。
实验内容:
1.用希尔排序算法对用户输入的一组数据按关键字进行排序输出
2.(选作题)使用快速排序算法对用户输入的一组数据按关键字进行排序并输出
3.(选作题)使用堆排序方法用户输入的一组数据按关键字进行排序并输出
实验用到数据结构:
逻辑结构:
数组
存储结构:
顺序存储结构
结构定义,功能函数声明如下:
#include
#include
#defineMAXSIZE20//一个用作示例的小顺序表的最大长度
typedefintKeytype;//定义关键字类型为整数类型
typedefstruct{
Keytypekey;//关键字项
}RedType;//记录类型
typedefstruct{
RedTyper[MAXSIZE+1];//r[0]闲置或用作哨兵
intlength;//顺序表长度
}SqList;//顺序表类型
typedefSqListHeapType;
voidShellInsert(SqList&L,intdk);
voidShellSort(SqList&L,intdlta[],intt);
intPartition(SqList&L,intlow,inthigh);
voidQSort(SqList&L,intlow,inthigh);
voidQuickSort(SqList&L);
voidprin(SqList&L,intlenth);
typedefSqListHeadType;
voidHeadAdjust(HeadType&H,ints,intm);
voidHeapSort(HeadType&H);
具体实现:
#include
#include
#defineMAXSIZE20//一个用作示例的小顺序表的最大长度
typedefintKeytype;//定义关键字类型为整数类型
typedefstruct{
Keytypekey;//关键字项
}RedType;//记录类型
typedefstruct{
RedTyper[MAXSIZE+1];//r[0]闲置或用作哨兵
intlength;//顺序表长度
}SqList;//顺序表类型
typedefSqListHeapType;
voidShellInsert(SqList&L,intdk);
voidShellSort(SqList&L,intdlta[],intt);
intPartition(SqList&L,intlow,inthigh);
voidQSort(SqList&L,intlow,inthigh);
voidQuickSort(SqList&L);
voidprin(SqList&L,intlenth);
typedefSqListHeadType;
voidHeadAdjust(HeadType&H,ints,intm);
voidHeapSort(HeadType&H);
voidShellInsert(SqList&L,intdk)
{
inti,j;
for(i=dk+1;i<=L.length;i++)
{
if(L.r[i].key{
L.r[0]=L.r[i];
for(j=i-dk;j>0&&L.r[0].key{
L.r[j+dk]=L.r[j];
}
L.r[j+dk]=L.r[0];
}
}
}
voidShellSort(SqList&L,intdlta[],intt)
{
inti;
for(i=0;i{
ShellInsert(L,dlta[i]);
}
}
intPartition(SqList&L,intlow,inthigh)
{
intp;
L.r[0].key=L.r[low].key;
p=L.r[low].key;
while(low{
while(low=p)
high--;
L.r[low].key=L.r[high].key;
while(lowlow++;
L.r[high].key=L.r[low].key;
}
L.r[low].key=L.r[0].key;
returnlow;
}
voidQSort(SqList&L,intlow,inthigh)
{
intp;
if(low{
p=Partition(L,low,high);
QSort(L,low,p-1);
QSort(L,p+1,high);
}
}
voidHeapAdjust(HeapType&H,ints,intm)//m为表长
{
intrc=H.r[s].key;
intj;
for(j=2*s;j<=m;j*=2)
{
if(j++j;
if(rc>=H.r[j].key)
break;
H.r[s].key=H.r[j].key;
s=j;
}
H.r[s].key=rc;
}
voidHeapSort(HeapType&H)
{
inti;
inttemp;
for(i=H.length/2;i>=1;--i)
{
HeapAdjust(H,i,H.length);
}
for(i=H.length;i>1;--i)
{
temp=H.r[1].key;
H.r[1].key=H.r[i].key;
H.r[i].key=temp;
HeapAdjust(H,1,i-1);
}
}
voidprin(SqList&L,intlenth)
{
inti;
for(i=1;i<=lenth;i++)
{
printf("%d\t",L.r[i].key);
}
printf("\n");
}
voidQuickSort(SqList&L)
{
QSort(L,1,L.length);
}
intmain()
{
SqListL;
inti,k;
L.length=20;
inta[21]={0,23,45,6,89,7,36,26,13,18,76,98,78,68,53,36,72,79,65,46,25};
intdlta[4]={7,5,3,1};
for(i=0;i<21;i++)
{
L.r[i].key=a[i];
}
prin(L,20);
printf("请输入k的值,1,希尔排序;2,快速排序;3堆排序,其他不排序");
switch(scanf("%d",&k))
{
case1:
ShellSort(L,dlta,4);
prin(L,20);
break;
case2:
QuickSort(L);
prin(L,20);
break;
case3:
HeapSort(L);
prin(L,20);
break;
default:
break;
}
return0;
}
实验结果:
实验心得:
通过这次实验让我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把理论知识与实际结合起来才能提高自己的运用能力和独立思考的能力。
在本次实验中,让我加深的了解希尔排序的几种方法以及概念,并对以往所学的的知识得到了巩固。