查找、排序综合实验
排序实验报告_排序综合实验报告材料

班级
2*10^7
10 电信 1 班
10^8
操作系统
10^5
Microsoft Windows 7 旗舰版 (64 位/Service Pck 1)
正序
xxxxxxxxxxxxx
逆序
编译软件
直接插入
Visul C++ 6.0
(带监视哨〕
emil
C
609803959.
24.874
10^4
100.158
2*10^4
中选出键值最小的记录,与无序区第一个记录 R 交换;新的无序区为 R 到
各种排序试验结果:
R[n],从中再选出键值最小的记录,与无序区第一个记录 R 交换;类似, CPU
第 i 趟排序时 R 到 R[i-1]是有序区,无序区为 R[i]到 R[n],从中选出键
(英特尔)Intel(R) Core(TM) i5 CPU M 480 2.67GHz
〔1〕二路并归排序:开始时,将排序表 R 到 R[n]看成 n 个长度为 1
录,顺序放在已排好序的子序列的后面〔或最前〕,直到全部记录排序完 的有序子表,把这些子表两两并归,便得到 n/2 个有序的子表〔当 n 为奇
毕。
数时,并归后仍是有一个长度为 1 的子表〕;然后,再把这 n/2 个有序的
〔1〕直接选择排序:首先,全部记录组成初始无序区 R 到 R[n],从 子表两两并归,如此反复,直到最终得到一个程度为 n 的有序表为止。
指导老师: 胡圣荣
序与排序要求相反时就交换两者的位置,直到没有反序的记录为止。
日期: 20XX.12.15~20XX.1.5
〔1〕冒泡排序:设想排序表 R 到 R[n]垂直放置,将每个记录 R[i]看
数据结构实验报告五,查找与排序-

数据结构实验报告五,查找与排序-查找与排序一、实验目的:1.理解掌握查找与排序在计算机中的各种实现方法。
2.学会针对所给问题选用最适合的算法。
3.熟练掌握常用排序算法在顺序表上的实现。
二、实验要求:掌握利用常用的查找排序算法的思想来解决一般问题的方法和技巧,进行算法分析并写出实习报告。
三、实验内容及分析:设计一个学生信息管理系统,学生对象至少要包含:学号、性别、成绩1、成绩总成绩等信息。
要求实现以下功能:1.平均成绩要求自动计算;2.查找:分别给定学生学号、性别,能够查找到学生的基本信息(要求至少用两种查找算法实现);3.? 排序:分别按学生的学号、成绩1、成绩2、平均成绩进行排序(要求至少用两种排序算法实现)。
四、程序的调试及运行结果五、程序代码#includestdio.h#includestring.hstruct student//定义结构体{char name;int a1,a2,a3,num;double pow;}zl;int count=0;void jiemian1(); //主界面//函数声明int jiemian2(); //选择界面void luru(); //录入函数void xianshi(); //显示void paixv(); //排序void diaoyong(int); //循环调用选择界面void tianjia(); //添加信息void chaxun1(); //按学号查询详细信息void chaxun2(); //按姓名查询详细信息void xiugai(); //修改信息void shanchu(); //删除信息void main() //main函数{jiemian1();//函数点用}void jiemian1() //主界面定义{char a;printf(“\n\n\n\n\t\t\t学员信息管理器\n\n\n\t\t\t 数据结构课程设计练习六\n\n\n\t\t\t 09信计2:于学彬\n\n“);printf("\n\t\t\t 按回车键继续:");scanf("%c",system("cls");jiemian2();}int jiemian2() //选择界面{int a,b;printf("*******************************主要功能********************************");printf("\n\n\n\n\t\t\t\t1.录入信息\n\n\t\t\t\t2.添加信息\n\n\t\t\t\t3.查看信息\n\n\t\t\t\t4.查询信息\n\n\t\t\t\t5.修改信息\n\n\t\t\t\t6.删除信息\n\n\t\t\t\t7.退出\n\n\t\t\t\t请选择:");scanf("%d",switch(a){case 1:system("cls");luru();break;case 2:system("cls");tianjia();break;case 3:system("cls");paixv();break;case 4:system("cls");printf("1.按学号查询详细信息\n2.按姓名查询详细信息\n请选择:");scanf("%d",switch(b){case 1:system("cls");chaxun1();break;case 2:system("cls");chaxun2();break;} break;case 5:system("cls");xiugai();break;case 6:system("cls");shanchu();break;case 7:system("cls");return a;break;}}void diaoyong(int b) //循环调用选择界面{char a='y';printf("是否返回选择页(y/n):");fflush(stdin);//清空输入缓冲区,通常是为了确保不影响后面的数据读取(例如在读完一个字符串后紧接着又要读取一个字符,此时应该先执行fflush(stdin);)a=getchar();system("cls");while(a=='y'||a=='Y'){b=jiemian2();if(b==7){break;}}}void luru() //录入函数{char a;//='y';do{printf("请输入学员信息:\n");printf("学号:");scanf("%d",zl[count].num);//调用结构体printf("姓名:");fflush(stdin);gets(zl[count].name);printf("三门成绩:\n");printf("成绩1:");scanf("%d",zl[count].a1);printf("成绩2:");scanf("%d",zl[count].a2);printf("成绩3:");scanf("%d",zl[count].a3);zl[count].pow=(zl[count].a1+zl[count].a2+zl[count].a3)/3;//求平均数printf("是否继续(y/n):");fflush(stdin);a=getchar();count++;system("cls");}while(a=='y'count100);//paixv();diaoyong(count);}void tianjia() //添加信息{char a='y';do{printf("请输入学员信息:\n");printf("学号:");scanf("%d",zl[count].num);printf("姓名:");//fflush(stdin);gets(zl[count].name);printf("三门成绩:\n");printf("成绩1:");scanf("%d",zl[count].a1);printf("成绩2:");scanf("%d",zl[count].a2);printf("成绩3:");scanf("%d",zl[count].a3);zl[count].pow=(zl[count].a1+zl[count].a2+zl[count].a3)/3; printf("是否继续(y/n):");//fflush(stdin);a=getchar();count++;system("cls");}while(a=='y'count100);paixv(count);diaoyong(count);}void xianshi() //显示{int i;printf("学号\t \t姓名\t\t\t平均成绩\n");for(i=0;icount;i++){printf("%d\t \t%s\t\t\t%f\n",zl[i].num,zl[i].name,zl[i].pow); }}void paixv() //排序{int i,j;struct student zl1;printf("排序前:\n");xianshi();for(i=0;icount;i++){for(j=1;jcount-i;j++){if(zl[j-1].powzl[j].pow){zl1=zl[j-1];zl[j-1]=zl[j];zl[j]=zl1;}}}printf("排序后:\n");xianshi();diaoyong(count);}void chaxun1() //按学号查询详细信息{int i,num;printf("请输入要查询学员的学号:");scanf("%d",num);printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n"); for(i=0;icount;i++){if(zl[i].num==num){printf("%d\t%s\t%d\t%d\t%d\t%.2f\n",zl[i].num,zl[i].name,zl[i].a1,zl[i].a2,zl [i].a3,zl[i].pow);}}diaoyong(count);}void chaxun2() //按姓名查询详细信息{int i;struct student zl1;printf("请输入要查询学员的姓名:");fflush(stdin);gets();printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n");for(i=0;icount;i++){if((strcmp(zl[i].name,))==0)//比较两个字符串的大小{printf("%d\t%s\t%d\t%d\t%d\t%.2f\n",zl[i].num,zl[i].name,zl[i].a1,zl[i].a2,zl [i].a3,zl[i].pow);}}diaoyong(count);}void xiugai() //修改信息{int i,num;printf("请输入要查询学员的学号:");scanf("%d",num);printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n");for(i=0;icount;i++){if(zl[i].num==num){break;}}printf("%d\t%s\t%d\t%d\t%d\t%.2f\n",zl[i].num,zl[i].name,zl[i].a1,zl[i].a2,zl [i].a3,zl[i].pow);printf("请输入学员信息:\n");printf("学号:");scanf("%d",zl[i].num);printf("姓名:");fflush(stdin);gets(zl[i].name);printf("三门成绩:\n");printf("成绩1:");scanf("%d",zl[i].a1);printf("成绩2:");scanf("%d",zl[i].a2);printf("成绩3:");scanf("%d",zl[i].a3);zl[i].pow=(zl[i].a1+zl[i].a2+zl[i].a3)/3;printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n"); printf("%d\t%s\t%d\t%d\t%d\t%.2f\n",zl[i].num,zl[i].name,zl[i].a1,zl[i].a2,zl[i].a3,zl[i].pow);diaoyong(count);}void shanchu() //删除信息{int num,i,j;printf("请输入要删除的学员学号:");scanf("%d",num);for(i=0;icount;i++){if(zl[i].num==num){for(j=i;jcount;j++){zl[j]=zl[j+1];}}}count--;xianshi();diaoyong(count);}。
数据结构实验8 查找与排序

注意事项:在磁盘上创建一个目录,专门用于存储数据结构实验的程序。
因为机房机器有还原卡,请同学们将文件夹建立在最后一个盘中,以学号为文件夹名。
实验八查找和排序一、实验目的掌握运用数据结构两种基本运算查找和排序,并能通过其能解决应用问题。
二、实验要求1.掌握本实验的算法。
2.上机将本算法实现。
三、实验内容为宿舍管理人员编写一个宿舍管理查询软件, 程序采用交互工作方式,其流程如下:建立数据文件,数据结构采用线性表,存储方式任选(建议用顺序存储结构),数据元素是结构类型(学号,姓名,性别,房号),元素的值可从键盘上输入,可以在程序中直接初始化。
数据文件按关键字(学号、姓名、房号)进行排序(排序方法任选一种),打印排序结果。
(注意字符串的比较应该用strcmp(str1,str2)函数)查询菜单: (查找方法任选一种)1. 按学号查询2. 按姓名查询3. 按房号查询打印任一查询结果(可以连续操作)。
参考:typedef struct {char sno[10];char sname[2];int sex; //以0表示女,1表示男int roomno;}ElemType;struct SqList{ElemType *elem;int length;};void init(SqList &L){L.elem=(ElemType *)malloc(MAXSIZE*sizeof(ElemType));L.length=0;}void printlist(SqList L){ int i;cout<<" sno name sex roomno\n";for(i=0;i<L.length;i++)cout<<setw(7)<<L.elem[i].sno<<setw(10)<<L.elem[i].sname<<setw(3)<<L.elem[i].sex<<setw(6) <<L.elem[i].roomno<<endl;}。
数据结构与算法实验报告5-查找与排序

北京物资学院信息学院实验报告
课程名_数据结构与算法
实验名称查找与排序
实验日期年月日实验报告日期年月日姓名______ ___ 班级_____ ________ 学号___
一、实验目的
1.掌握线性表查找的方法;
2.了解树表查找思想;
3.掌握散列表查找的方法.
4.掌握插入排序、交换排序和选择排序的思想和方法;
二、实验内容
查找部分
1.实现顺序查找的两个算法(P307), 可以完成对顺序表的查找操作, 并根据查到和未查到两种情况输出结果;
2.实现对有序表的二分查找;
3.实现散列查找算法(链接法),应能够解决冲突;
排序部分
4.分别实现直接插入排序、直接选择排序、冒泡排序和快速排序算法
三、实验地点与环境
3.1 实验地点
3.2实验环境
(操作系统、C语言环境)
四、实验步骤
(描述实验步骤及中间的结果或现象。
在实验中做了什么事情, 怎么做的, 发生的现象和中间结果, 给出关键函数和主函数中的关键段落)
五、实验结果
六、总结
(说明实验过程中遇到的问题及解决办法;个人的收获;未解决的问题等)。
查找排序实验报告

查找排序实验报告一、实验目的本次实验的主要目的是深入理解和比较不同的查找和排序算法在性能和效率方面的差异。
通过实际编程实现和测试,掌握常见查找排序算法的原理和应用场景,为今后在实际编程中能够选择合适的算法解决问题提供实践经验。
二、实验环境本次实验使用的编程语言为 Python,开发环境为 PyCharm。
计算机配置为:处理器_____,内存_____,操作系统_____。
三、实验内容1、查找算法顺序查找二分查找2、排序算法冒泡排序插入排序选择排序快速排序四、算法原理1、顺序查找顺序查找是一种最简单的查找算法。
它从数组的一端开始,依次比较每个元素,直到找到目标元素或者遍历完整个数组。
其时间复杂度为 O(n),在最坏情况下需要遍历整个数组。
2、二分查找二分查找适用于已排序的数组。
它通过不断将数组中间的元素与目标元素进行比较,将查找范围缩小为原来的一半,直到找到目标元素或者确定目标元素不存在。
其时间复杂度为 O(log n),效率较高。
3、冒泡排序冒泡排序通过反复比较相邻的两个元素并交换它们的位置,将最大的元素逐步“浮”到数组的末尾。
每次遍历都能确定一个最大的元素,经过 n-1 次遍历完成排序。
其时间复杂度为 O(n^2)。
4、插入排序插入排序将数组分为已排序和未排序两部分,每次从未排序部分取出一个元素,插入到已排序部分的合适位置。
其时间复杂度在最坏情况下为 O(n^2),但在接近有序的情况下性能较好。
5、选择排序选择排序每次从待排序数组中选择最小的元素,与当前位置的元素交换。
经过 n-1 次选择完成排序。
其时间复杂度为 O(n^2)。
6、快速排序快速排序采用分治的思想,选择一个基准元素,将数组分为小于基准和大于基准两部分,然后对这两部分分别递归排序。
其平均时间复杂度为 O(n log n),在大多数情况下性能优异。
五、实验步骤1、算法实现使用Python 语言实现上述六种查找排序算法,并分别封装成函数,以便后续调用和测试。
查找、排序的应用 实验报告

实验七查找、排序的应用一、实验目的1、本实验可以使学生更进一步巩固各种查找和排序的基本知识。
2、学会比较各种排序与查找算法的优劣。
3、学会针对所给问题选用最适合的算法。
4、掌握利用常用的排序与选择算法的思想来解决一般问题的方法和技巧。
二、实验内容[问题描述]对学生的基本信息进行管理。
[基本要求]设计一个学生信息管理系统,学生对象至少要包含:学号、姓名、性别、成绩1、成绩2、总成绩等信息。
要求实现以下功能:1.总成绩要求自动计算;2.查询:分别给定学生学号、姓名、性别,能够查找到学生的基本信息(要求至少用两种查找算法实现);3.排序:分别按学生的学号、成绩1、成绩2、总成绩进行排序(要求至少用两种排序算法实现)。
[测试数据]由学生依据软件工程的测试技术自己确定。
三、实验前的准备工作1、掌握哈希表的定义,哈希函数的构造方法。
2、掌握一些常用的查找方法。
1、掌握几种常用的排序方法。
2、掌握直接排序方法。
四、实验报告要求1、实验报告要按照实验报告格式规范书写。
2、实验上要写出多批测试数据的运行结果。
3、结合运行结果,对程序进行分析。
五、算法设计a、折半查找设表长为n,low、high和mid分别指向待查元素所在区间的下界、上界和中点,key为给定值。
初始时,令low=1,high=n,mid=(low+high)/2,让key与mid指向的记录比较,若key==r[mid].key,查找成功若key<r[mid].key,则high=mid-1若key>r[mid].key,则low=mid+1重复上述操作,直至low>high时,查找失败b、顺序查找从表的一端开始逐个进行记录的关键字和给定值的比较。
在这里从表尾开始并把下标为0的作为哨兵。
void chaxun(SqList &ST) //查询信息{ cout<<"\n************************"<<endl;cout<<"~ (1)根据学号查询 ~"<<endl;cout<<"~ (2)根据姓名查询 ~"<<endl;cout<<"~ (3)根据性别查询 ~"<<endl;cout<<"~ (4)退出 ~"<<endl;cout<<"************************"<<endl; if(m==1) 折半查找算法:for(int i=1;i<ST.length;i++)//使学号变为有序for(int j=i;j>=1;j--)if(ST.r[j].xuehao<ST.r[j-1].xuehao){LI=ST.r[j];ST.r[j]=ST.r[j-1];ST.r[j-1]=LI;}int a=0;cout<<"输入要查找的学号"<<endl;cin>>n;int low,high,mid;low=0;high=ST.length-1; // 置区间初值while (low<=high){mid=(low+high)/2;if(n==ST.r[mid].xuehao){cout<<ST.r[mid].xuehao<<""<<ST.r[mid].xingming<<""<<ST.r[mid].xingbei<<""<<ST.r[mid].chengji1<<""<<ST.r[mid].chengji2<<""<<ST.r[mid].zong<<endl;a=1;break;}else if(n<ST.r[mid].xuehao )high=mid-1; // 继续在前半区间进行查找elselow=mid+1; // 继续在后半区间进行查找顺序查找算法:cout<<"输入要查找的姓名"<<endl;cin>>name;for(int i=0;i<ST.length;i++){if(name==ST.r[i].xingming){cout<<ST.r[i].xuehao<<""<<ST.r[i].xingming<<""<<ST.r[i].xingbei<<""<<ST.r[i].chengji1<<""<<ST.r[i].chengji2<<""<<ST.r[i].zong<<endl;a=1;}1、插入排序每步将一个待排序的记录,按其关键码大小,插入到前面已经排好序的一组记录的适当位置上,直到记录全部插入为止。
排序和查找的实验报告
排序和查找的实验报告实验报告:排序和查找引言排序和查找是计算机科学中非常重要的基本算法。
排序算法用于将一组数据按照一定的顺序排列,而查找算法则用于在已排序的数据中寻找特定的元素。
本实验旨在比较不同排序和查找算法的性能,并分析它们的优缺点。
实验设计为了比较不同排序算法的性能,我们选择了常见的几种排序算法,包括冒泡排序、插入排序、选择排序、快速排序和归并排序。
我们使用相同的随机数据集对这些算法进行了测试,并记录了它们的执行时间和占用空间。
在查找算法的比较实验中,我们选择了顺序查找和二分查找两种常见的算法。
同样地,我们使用相同的随机数据集对这些算法进行了测试,并记录了它们的执行时间和占用空间。
实验结果在排序算法的比较实验中,我们发现快速排序和归并排序在大多数情况下表现最好,它们的平均执行时间和空间占用都要优于其他排序算法。
而冒泡排序和插入排序则表现较差,它们的执行时间和空间占用相对较高。
在查找算法的比较实验中,二分查找明显优于顺序查找,尤其是在数据规模较大时。
二分查找的平均执行时间远远小于顺序查找,并且占用的空间也更少。
结论通过本实验的比较,我们得出了一些结论。
首先,快速排序和归并排序是较优的排序算法,可以在大多数情况下获得较好的性能。
其次,二分查找是一种高效的查找算法,特别适用于已排序的数据集。
最后,我们也发现了一些排序和查找算法的局限性,比如冒泡排序和插入排序在大数据规模下性能较差。
总的来说,本实验为我们提供了对排序和查找算法性能的深入了解,同时也为我们在实际应用中选择合适的算法提供了一定的参考。
希望我们的实验结果能够对相关领域的研究和应用有所帮助。
查找排序实验四作业
查找排序实验四作业试验四:查找、排序一、实验描述:1. 简单选择排序算法验证实验目的⑴掌握简单选择排序算法的基本思想;⑵ 掌握简单选择排序算法的实现方法;⑶ 验证简单选择排序算法的时间性能。
实验内容对一组数据进行简单选择排序(按升序排列)。
算法思想与设计1. 采用单链表进行排序操作;2. 简单选择排序的基本思想:对待排序进行若干趟处理,通过n-i次关键字的比较,从n-i+1个记录中选出关键字最小记录和第i(1<=i<=n)个记录进行交换,这样一趟处理就能确定一个数的位置,对n个数如果确定n-1个数的位置,则这n 个数就排序成功。
3. 选择排序算法的时间复杂度为O(n2)。
并且排序是稳定的。
算法设计1.数据结构设计使用一个简单的链表作为选择排序的操作对象。
//单链表结构体定义class Si ngleL ink{private int idata;public int Data;{get{return idata;}set{idata=value;} }public Sin gleL ink n ex t; public Sin gleL in k(){idata = -1;n ext =n ull;} public Sin gleL in k(i nt data){ idata = -1;n ext = nu II;}}2. 算法流程图:2.1初始化单链表循环在单链表尾部初始化完2.2简单选择排序i++ 否排序数据中返回3. 代码算法实现3.1单链表初始化Randomr= new Random();〃从1 〜100 间产生数list.clear();〃清空单链表for(i nt i = 0; i < dlbl on g;i++){list.I nsert(r.Next(100));〃节点插入操作f++;}TextBox1.Text = list.Disply();〃返回整个单链表显示3.2单链表选择排序y = head;flag = head .n ex t;int n = 0,i,j,temp=0,biaoji;y = head .n ex t;p = head .n ex t;q = head .n ex t;for(i = 0 ; i < n -1;i++){flag = p;q = p;biaoji = q.Data;for(j=i;j< n-1;j++){if(q.n ext.Data < biaoji){flag = q.n ex t;fiaoji = q.n ext.Data;}q=q.n ex t;}temp = p.Data;p.Data = flag.Data;flag.Data = temp;P = p.n ex t;}retur n true;4. 测试采用黑盒测试方法测试。
实验六 数据查找与排序
实验六数据查找与排序(3学时)实验性质:综合实验目的要求:1.理解各种查找的思想,实现对数据的查找。
例如用:直接查找法和折半查找法。
2.理解各种排序的思想,实现对数据的排序。
例如用:起泡排序和插入排序。
实验内容:1.任意输入10个整型数据,然后再输入一个数据进行查找。
设计的程序能对输入的数据进行查找,然后把数据所在的位置输出。
2.任意输入10个整型数据,并对输入的10个数据进行排序。
注意要点:实验中体会不同的查找、排序方法所具有的特点,关注其在效率上的不同。
直接查找#include <stdio.h>void main(){int a[10],i,n;printf("任意输入10个整形数:");for(i=0;i<10;i++){scanf("%d",&a[i]);}printf("再输入一个数据进行查找:");scanf("%d",&n);for(i=0;i<10;i++){if(n==a[i]){ break;}}if(i>=10){ printf("没有找到%d!",n); }else{ printf("找到了!the %d is at %d position",n,i); }}排序#include <stdio.h>#define NUM 10struct data{int value;int seat;} D[NUM],Dtmp;void main(){int i,j,k;printf("输入%d个整数:",NUM);for(i=0; i<NUM; D[i].seat=i++)scanf("%d",&D[i].value);printf("原始数据顺序:\n")for(i=0;i<NUM;i++) printf("%d ",D[i].value);for(i=0; i<NUM; i++)for(j=0;j<NUM-1-i;j++)if(D[j].value>D[j+1].value){Dtmp.value = D[j].value; D[j].value=D[j+1].value; D[j+1].value=Dtmp.value;Dtmp.seat = D[j].seat; D[j].seat=D[j+1].seat; D[j+1].seat=Dtmp.seat;}printf("排序后的数据:\n");for(i=0;i<NUM;i++) printf("%d[%d] ",D[i].value,D[i].seat);}。
查找排序实验报告总结
一、实验目的本次实验旨在通过编写程序实现查找和排序算法,掌握基本的查找和排序方法,了解不同算法的优缺点,提高编程能力和数据处理能力。
二、实验内容1. 查找算法本次实验涉及以下查找算法:顺序查找、二分查找、插值查找。
(1)顺序查找顺序查找算法的基本思想是从线性表的第一个元素开始,依次将线性表中的元素与要查找的元素进行比较,若找到相等的元素,则查找成功;若线性表中所有的元素都与要查找的元素进行了比较但都不相等,则查找失败。
(2)二分查找二分查找算法的基本思想是将待查找的元素与线性表中间位置的元素进行比较,若中间位置的元素正好是要查找的元素,则查找成功;若要查找的元素比中间位置的元素小,则在线性表的前半部分继续查找;若要查找的元素比中间位置的元素大,则在线性表的后半部分继续查找。
重复以上步骤,直到找到要查找的元素或查找失败。
(3)插值查找插值查找算法的基本思想是根据要查找的元素与线性表中元素的大小关系,估算出要查找的元素应该在大致的位置,然后从这个位置开始进行查找。
2. 排序算法本次实验涉及以下排序算法:冒泡排序、选择排序、插入排序、快速排序。
(1)冒泡排序冒泡排序算法的基本思想是通过比较相邻的元素,将较大的元素交换到后面,较小的元素交换到前面,直到整个线性表有序。
(2)选择排序选择排序算法的基本思想是在未排序的序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
以此类推,直到所有元素均排序完毕。
(3)插入排序插入排序算法的基本思想是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增加1的有序表。
(4)快速排序快速排序算法的基本思想是选择一个元素作为基准元素,将线性表分为两个子表,一个子表中所有元素均小于基准元素,另一个子表中所有元素均大于基准元素,然后递归地对两个子表进行快速排序。
三、实验结果与分析1. 查找算法通过实验,我们发现:(1)顺序查找算法的时间复杂度为O(n),适用于数据量较小的线性表。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
淮海工学院计算机科学系实验报告书课程名:《数据结构》题目:查找、排序综合实验班级:学号:姓名:排序、查找的应用实验报告要求1目的与要求:1)查找、排序是日常数据处理过程中经常要进行的操作和运算,掌握其算法与应用对于提高学生数据处理能力和综合应用能力显得十分重要。
2)本次实验前,要求同学完整理解有关排序和查找的相关算法和基本思想以及种算法使用的数据存储结构;3)利用C或C++语言独立完成本次实验内容或题目,程序具有良好的交互性(以菜单机制实现实验程序的交互运行)和实用性;4)本次实验在机房现场验收和平分,希望同学们认真对待,并按时完成实验任务;5)认真书写实验报告(包括程序清单及相关实验数据与完整运行结果),并于16周周五前提交,综合实验纸质报告每班收10份。
2 实验内容或题目题目:对记录序列(查找表):{55,13,23,72,109,67,02,78,13}分别实现如下操作:1)顺序查找;2)分别使用直接插入排序、冒泡排序、快速排序对原纪录序列进行排序(本次要做);3)对排好序的纪录序列表进行折半查找;4)利用原纪录序列建立一颗二叉排序树,并在其上实现特定关键字值结点的查找;5)按照“除留余数法”哈希构造函数和线性探测再散列的冲突处理方法创建表长为m=11的哈希表(本次实验做);6)实现5)创建哈希表上的查找。
7)看懂书上“链式基数排序”方法的分配收集排序举例,并以书上例题为例,实现这种排序方法。
(选作)3 实验步骤与源程序#include <iostream.h>#include <malloc.h>#define maxsize 12#define TRUE 1#define FALSE 0#define NULL 0#define listsize 9#define keysize 9#define MAX 100#define radix 9typedef int keytype;typedef struct{int key;int flag;}Elemtype;typedef struct{Elemtype *elem;int sizeindex;int count;}HashTable;typedef struct node{int key;struct node *lchild,*rchild;}bstnode,*bstree;typedef struct{int key;int next;}recordtype;typedef struct{keytype key[keysize];int type;int next;}recordtype1;typedef struct{recordtype1 r[keysize +1];int length;int keynum;}slinklist;typedef struct{recordtype r[listsize +1];int length;}recordlist;typedef int pvector[radix];//创建哈希表int CreatHashTable(HashTable* H,int m){int i,keys,p,len;H->elem = (Elemtype *)malloc( sizeof(Elemtype)); H->sizeindex = MAX;H->count=0;cout<<"请输入该组关键字的个数:"<<endl; cin>>m;cout<<"请输入表长len:"<<endl;cin>>len;H->sizeindex = len;for(i = 0;i < m;++i){H->elem[i].flag = 0;}cout<<"请输入该组关键字:"<<endl;for(i = 0;i < m;++i){cin>>keys;p = keys %m;while(H->elem[p].flag == 1){int d=1;p = (p +d)% m;d++;}H->elem[p].key = keys;H->elem[p].flag = 1;H->count++;}for(int j=H->count;j<len;j++)H->elem[j].key=0;cout<<"哈希表创建完毕!"<<endl;cout<<"下标关键字"<<endl;for(i = 0;i<len;i++){cout<<i<<" ";cout<<H->elem[i].key<<endl;}return 1;}void SearchHashTable(HashTable* H){int keys,p;cout<<"请输入您要查找的关键字:"<<endl;cin>>keys;for(int i=0;i<H->count;i++){if( keys == H->elem[i].key)p=i;}if(p>-1&&p<H->count){cout<<"查找成功!"<<endl;cout<<"该关键字在哈希表中的下标为:"<<p<<endl; }elsecout<<"查找失败,表中无此关键字!"<<endl;}//初始化void initrecord(recordlist * l){l->r[1].key=55;l->r[2].key=13;l->r[3].key=23;l->r[4].key=72;l->r[5].key=109;l->r[6].key=67;l->r[7].key=2;l->r[8].key=78;l->r[9].key=13;}//顺序查找int seqsearch(recordlist * l,int k){int i=l->length ;while(i>=1&&l->r[i].key!=k)i--;if(i>=1){cout<<"存在该元素:"<<l->r[i].key<<endl;cout<<"该元素所在位置:"<<i<<endl;return(i);}else{cout<<"不存在该元素!"<<endl;return(0);}}//直接插入排序void inssort(recordlist * l){int j;for(int i=2;i<=l->length;i++){l->r[0].key=l->r[i].key;j=i-1;while(l->r[0].key<l->r[j].key){l->r[j+1].key =l->r[j].key ;j=j-1;}l->r[j+1].key=l->r[0].key;}for(int m=1;m<=l->length;m++)cout<<l->r[m].key<<" ";cout<<endl;}//冒泡排序void bubblesort(recordlist * l){int i,j,x;int change=TRUE;for(i=1;i<=l->length && change;++i){change=FALSE;for(j=1;j<=l->length-i;++j)if(l->r[j].key>l->r[j+1].key){x=l->r[j].key;l->r[j].key=l->r[j+1].key ;l->r[j+1].key=x;change=TRUE;}}for(int m=1;m<=l->length;m++)cout<<l->r[m].key<<" ";cout<<endl;}//快速排序int qkpass(recordlist * l,int left,int right) {int x=l->r[left].key;int low=left;int high=right;while(low<high){while(low<high && l->r[high].key >=x)high--;if(low<high){l->r[low].key =l->r[high].key ;low++;}while(low<high && l->r[high].key<x)low++;if(low<high){l->r[high].key=l->r[low].key;high--;}}l->r[low].key=x;return low;}void qksort(recordlist *l,int low,int high){int pos;if(low<=high){pos=qkpass(l,low,high);qksort(l,low,pos-1);qksort(l,pos+1,high);}}//折半查找int binsrch(recordlist * l,int k){int low=1,high=l->length,mid;while(low<=high){mid=(low+high)/2;if(k==l->r[mid].key){cout<<"存在该元素:"<<l->r[mid].key<<endl;cout<<"该元素所在位置:"<<mid<<endl;return(1);}else if(k<l->r[mid].key)high=mid-1;elselow=mid+1;}cout<<"查找失败!"<<endl;return(0);}//建立平衡二叉排序树void insertbst(bstree *bst,int k){bstree s;if(*bst==NULL){s=(bstnode*)malloc(sizeof(bstnode));s->key=k;s->lchild=NULL;s->rchild=NULL;*bst=s;}else if(k<(*bst)->key)insertbst(&((*bst)->lchild),k);else if(k>(*bst)->key)insertbst(&((*bst)->rchild),k);}void creatbstree(bstree *bst){int k;*bst=NULL;cout<<"输入元素:"<<endl;cin>>k;while(k!=0){insertbst(bst,k);cout<<"输入元素:"<<endl;cin>>k;}}//二叉树查找int searchbst(bstree bst,int k){if(!bst)return NULL;else if(bst->key==k){cout<<"输出特定元素:"<<bst->key<<endl;return 1;}elseif(k<bst->key)searchbst(bst->lchild,k);elsesearchbst(bst->rchild,k);return 0;}//简单排序void selectsort(recordlist * l){int i,j,k,x;for(i=1;i<=l->length;++i){k=i;for(j=1;j<=l->length;++j){if(l->r[j].key<l->r[k].key)k=j;if(k!=i){x=l->r[i].key;l->r[i].key=l->r[k].key;l->r[k].key=x;}}}}void main(){int f=1,e,k,r,q;char s;recordlist * L;slinklist * L1;HashTable* h;h=(HashTable*)malloc(sizeof(HashTable));bstree * B;L1=(slinklist *)malloc(sizeof(slinklist));L=(recordlist*)malloc(sizeof(recordlist));B=(bstree *)malloc(sizeof(bstree) );cout<<"输入所创顺序表的长度:"<<endl;cin>>r;L->length=r;cout<<"输入表的元素:"<<endl;for(int i=1;i<=L->length;i++)cin>>L->r[i].key;while(f){cout<<endl;cout<<"-------------请输入序号:-----------------"<<endl;cout<<"顺序查找请输入:A "<<endl;cout<<"直接插入排序请输入:B"<<endl;cout<<"冒泡排序请输入:C"<<endl;cout<<"快速排序请输入:D"<<endl;cout<<"折半查找请输入:E"<<endl;cout<<"建立二叉排序树请输入:F"<<endl;cout<<"查找二叉树特定关键字请输入:G"<<endl;cout<<"建立哈希表请输入:H"<<endl;cout<<"哈希表上查找请输入:I"<<endl;cout<<"简单排序请输入:J"<<endl;cout<<"退出请输入:K"<<endl;cout<<"输入操作序号:"<<endl;cin>>s;switch(s){case 'A':cout<<"进行顺序查找:"<<endl;cout<<"输入要查找的元素:"<<endl;cin>>k;seqsearch(L,k);break;case 'B':cout<<"进行直接插入排序:"<<endl;inssort(L);break;case 'C':cout<<"进行还原:"<<endl;initrecord(L);for( e=1;e<=L->length;e++)cout<<L->r[e].key<<" ";cout<<endl;cout<<"进行冒泡排序:"<<endl;bubblesort(L);break;case 'D':cout<<"进行还原:"<<endl;initrecord(L);for( e=1;e<=L->length;e++)cout<<L->r[e].key<<" ";cout<<endl;cout<<"快速排序:"<<endl;qksort(L,1,9);for( q=1;q<=L->length;q++)cout<<L->r[q].key<<" ";cout<<endl;break;case 'E':cout<<"进行折半查找:"<<endl;cout<<"输入要查找的元素:"<<endl;cin>>k;binsrch(L,k);break;case 'F':cout<<"建立二叉排序树,最后以00结束:"<<endl;creatbstree(B);break;case 'G':cout<<"二叉排序树查找特定元素:"<<endl;cout<<"输入要查找元素:"<<endl;cin>>k;searchbst(*B,k);break;case 'H':cout<<"创建哈希表:"<<endl;CreatHashTable(h,9);break;case 'I':cout<<"哈希表上的查找:"<<endl;SearchHashTable(h);break;case 'J':cout<<"进行还原:"<<endl;initrecord(L);for( e=1;e<=L->length;e++)cout<<L->r[e].key<<" ";cout<<endl;cout<<"简单选择排序:"<<endl;selectsort(L);for( q=1;q<=L->length;q++)cout<<L->r[q].key<<" ";cout<<endl;break;case 'K':f=0;cout<<"退出!"<<endl;break;}}}4 测试数据与实验结果(可以抓图粘贴)5 结果分析与实验体会这是最后一次试验了,也算是比较难的实验。