数据结构实验6 排序2.docx
- 文档编号:8225800
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:10
- 大小:355.71KB
数据结构实验6 排序2.docx
《数据结构实验6 排序2.docx》由会员分享,可在线阅读,更多相关《数据结构实验6 排序2.docx(10页珍藏版)》请在冰豆网上搜索。
数据结构实验6排序2
实验6排序算法实现实验
本实验为验证和操作实验,需要4学时。
1.实验目的
熟悉几种典型的排序方法(插入,选择,快速,希尔排序),并对各种算法的特点、使用范围和效率有进一步的了解。
2.实验内容
用C++描述并实现以上几种典型排序主要查找算法及其主要操作,其逻辑结构。
完成如下程序:
#include
usingnamespacestd;
typedefintKeyType;//关键字的类型
constintMAXSIZE=100;//数组的容量
//-------------------------------------------------------------
structElemType//学生的记录信息
{
KeyTypekey;//学号
charname[10];//姓名
intenglish;//成绩
intmath;//成绩
};
//-------------------------------------------------------------
classSqHash
{
public:
ElemType*ht,*z;//表数组
intlength;
intcouts;
//表大小(长度)
//KeyTypep;//除留余数法的大质数
public:
SqHash(intn1,intp1);
~SqHash()
{
delete[]ht;
length=0;
};
voidcreat_hash();
//intfind(KeyTypek);
intsort1();
//voidcreat_hash();
voidPrintOut();
};
//-------------------------------------------------------------
SqHash:
:
SqHash(intn1,intp1)
{
intp;
length=n1;
p=p1;
ht=newElemType[length];
for(inti=0;i ht[i].key=-1; } //------------------------------------------------------------- voidSqHash: : creat_hash() { inti,K,en,ma; i=0; charna[10]; cout<<"\n请逐一输入各个学号(关键字值)(-1结束): "; cin>>K; couts=0; while(K! =-1&&i { //cout<<"\n请输入学生的姓名,英语成绩和高数成绩: "; //cin>>na>>en>>ma; ht[i].key=K; //strcpy(ht[i].name,na);//用串拷贝赋值 //ht[i].english=en; //ht[i].math=ma;// 插入学生记录K cout<<"\n插入成功! "; i++; couts++; cout<<"\n请逐一输入各个学号(关键字值)(-1结束): "; cin>>K; } } //------------------------------------------------------------- //查询某关键字的记录 intSqHash: : sort1() { inti,j,k=1;intll[1]; //元素从1开始存储,couts表示数组中含有元素个数,此处即为最后一个元素的下标 for(i=2;i<=couts;i++) { if(ht[i].key { ll[1]=ht[0].key; ht[0]=ht[i];//设置监视哨 for(k;k<=1;k+2) ht[0].key=ll[1]; for(j=i-1;ht[0].key ht[j+1].key=ht[j].key; ht[j+1].key=ht[0].key; } } if(i! =0) return1; else return0; } //------------------------------------------------------------- voidSqHash: : PrintOut() { inti,j; for(i=0;i { if(ht[i].key! =-1) cout<<"\ni="< "< //<<"姓名: "< //<<"英语成绩: "< "< } } //------------------------------------------------------------- intmain() { intp0,n0; cout<<"\n请输入n值(n值应是记录总数的1.3-1.5倍)"; cin>>n0; cout<<"\n请输入P值(应是不大于n的大质数): "; cin>>p0; SqHashha(n0,p0); ElemTypea; intk; do{ cout<<"\n\n\n"; cout<<"\n1.建立表"; cout<<"\n2.对学生记录排序"; cout<<"\n3.输出表"; cout<<"\n4.结束"; cout<<"\n======================================="; cout<<"\n输入您的选择(1,2,3,4): "; cin>>k; switch(k) { case1: { ha.creat_hash(); }break; case2: { cout<<"\n排序学生数据: "; inti=ha.sort1(); if(i==-1) cout<<"\n排序不成功"< else cout<<"排序成功! "; }break; case3: { ha.PrintOut(); }break; } }while(k>=1&&k<=3); return0; } 3.实验结果 1.运行与建表 2.输出表(排序前) 3.排序 4.输出表(排序后) 5.结束 4.实验总结 Shell排序(ShellSort) Shell排序通过将数据分成不同的组,先对每一组进行排序,然后再对所有的元素进行一次插入排序,以减少数据交换和移动的次数。 平均效率是O(nlogn)。 其中分组的合理性会对算法产生重要的影响。 现在多用D.E.Knuth的分组方法。 Shell排序比冒泡排序快5倍,比插入排序大致快2倍。 Shell排序比起QuickSort,MergeSort,HeapSort慢很多。 但是它相对比较简单,它适合于数据量在5000以下并且速度并不是特别重要的场合。 它对于数据量较小的数列重复排序是非常好的。 Shell排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。 所以,希尔排序的时间复杂度会比o(n^2)好一些。 由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。 快速排序(QuickSort) 快速排序是一个就地排序,分而治之,大规模递归的算法。 从本质上来说,它是归并排序的就地版本。 快速排序可以由下面四步组成: (1)如果不多于1个数据,直接返回。 (2)一般选择序列最左边的值作为支点数据。 (3)将序列分成2部分,一部分都大于支点数据,另外一部分都小于支点数据。 (4)对两边利用递归排序数列。 快速排序比大部分排序算法都要快。 尽管我们可以在某些特殊的情况下写出比快速排序快的算法,但是就通常情况而言,没有比它更快的了。 快速排序是递归的,对于内存非常有限的机器来说,它不是一个好的选择。 快速排序有两个方向,左边的i下标一直往右走,而右边的j下标一直往左走,比如序列为53343891011,现在中枢元素5和3(第5个元素,下标从1开始计)交换就会把元素3的稳定性打乱,所以快速排序是一个不稳定的排序算法。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构实验6 排序2 数据结构 实验 排序