您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 实验报告-排序与查找
电子科技大学信息与软件工程学院实验报告第1页电子科技大学实验报告课程名称:数据结构与算法学生姓名:学号:点名序号:指导教师:实验地点:基础实验大楼实验时间:5月20日2014-2015-2学期信息与软件工程学院电子科技大学信息与软件工程学院实验报告第2页实验报告(二)学生姓名学号:指导教师:实验地点:基础实验大楼实验时间:5月20日一、实验室名称:软件实验室二、实验项目名称:数据结构与算法—排序与查找三、实验学时:4四、实验原理:快速排序的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。假设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序。一躺快速排序的算法是:1)设置两个变量I、J,排序开始的时候I:=1,J:=N2)以第一个数组元素作为关键数据,赋值给X,即X:=A[1];3)从J开始向前搜索,即(J:=J-1),找到第一个小于X的值,两者交换;4)从I开始向后搜索,即(I:=I+1),找到第一个大于X的值,两者交换;5)重复第3、4步,直到I=J。二分法查找(折半查找)的基本思想:(1)确定该区间的中点位置:mid=(low+high)/2min代表区间中间的结点的位置,low代表区间最左结点位置,high代表区间最右结点位置(2)将待查a值与结点mid的关键字(下面用R[mid].key)比较,若相等,则查找成功,否则确定新的查找区间:A)如果R[mid].keya,则由表的有序性可知,R[mid].key右侧的值都大于a,所以等于a的关键字如果存在,必然在R[mid].key左边的表中,这时high=mid-1;B)如果R[mid].keya,则等于a的关键字如果存在,必然在R[mid].key右边的表中。这时low=mid;C)如果R[mid].key=a,则查找成功。(3)下一次查找针对新的查找区间,重复步骤(1)和(2)(4)在查找过程中,low逐步增加,high逐步减少,如果highlow,则查找失败。电子科技大学信息与软件工程学院实验报告第3页五、实验目的:本实验通过实现快速排序和折半查找算法,使学生理解如何实现快速查找和排序的基本算法思想。通过练习,加强对算法的理解,提高编程能力。六、实验内容:(1)实现数据序列的输入;(2)实现快速排序算法,并对输入的序列排序后输出;(3)实现折半查找算法,并在步骤(2)排序后的序列上,进行任意地查找,并输出查询结果。七、实验器材(设备、元器件):PC机一台,装有C语言集成开发环境。八、数据结构与程序:#includestdio.h#includestdlib.h#defineMAX1000#defineFROMFILE1typedefstructJD{intkey;}JD;intbinsrch(JDr[],intn,intk){intlow,high,mid,found;low=1;high=n;found=0;while((low=high)&&(found==0)){mid=(low+high)/2;if(kr[mid].key)low=mid+1;elseif(k==r[mid].key)found=1;elsehigh=mid-1;}if(found==1)return(mid);elsereturn(0);}voidquicksort(JDr[],intlow,inthigh){inti,j,k;电子科技大学信息与软件工程学院实验报告第4页JDx;if(low=high)return;i=low;j=high;x=r[i];while(ij){while((ij)&&(r[j].key=x.key))j--;if(ij){r[i]=r[j];i++;}while((ij)&&(r[i].key=x.key))i++;if(ij){r[j]=r[i];j--;}}r[i]=x;quicksort(r,low,j-1);quicksort(r,j+1,high);}//快速排序intmain(){printf(欢迎使用快速排序与二分查找。\n\n);#ifdefFROMFILEprintf(请输入你所要查找的数组长度:);intlength;scanf(%d,&length);getchar();JDa[length+1];a[0].key=0;inti;for(i=1;i=length;i++){printf(输入第%d个数字:,i);scanf(%d,&a[i].key);getchar();}#elseFILE*fp;fp=fopen(test.txt,r);if(!fp){printf(文件不存在!);return0;}JDa[MAX];a[0].key=0;inti=1;电子科技大学信息与软件工程学院实验报告第5页while(fscanf(fp,%d,&a[i++].key)!=EOF);intlength=i-1;printf(文件内的信息:);for(i=1;ilength;i++){printf(%d,a[i].key);}printf(\n);length--;fclose(fp);#endifquicksort(a,0,length);printf(\n);intkey;printf(请输入你想查找的数字:);scanf(%d,&key);getchar();printf(\n);intlocation=binsrch(a,length,key);printf(位置:);for(i=1;i=length;i++){printf(%3d,i);}printf(\n);printf(数字:);for(i=1;i=length;i++){printf(%3d,a[i].key);}printf(\n);if(location){intcount=0;printf(目标数字出现的位置:);电子科技大学信息与软件工程学院实验报告第6页for(i=1;i=length;i++){if(a[i].key==a[location].key){printf(%d,i);count++;}}printf(\n数字%d出现的次数:%d\n,a[location].key,count);}else{printf(该数字不存在!\n\n);}return0;}九、程序运行结果:电子科技大学信息与软件工程学院实验报告第7页十、实验结论:此次操作证明可以用编程实现快速排序并在其后进行二分查找,实验结果正确。十一、总结及心得体会:通过本次实验,我对快速排序与二分查找有了更加深刻的了解。我尝试了书上没有的结构体,使自己的感觉丰富了许多,耳目一新,加深了我对学习编程的兴趣。练习了结构体、指针排序、查找等操作,熟练掌握树的操作。对知识的巩固与加深起到了很大的作用,我受益匪浅。
本文标题:实验报告-排序与查找
链接地址:https://www.777doc.com/doc-1879724 .html