1、基础实验大楼 A508 实验时间:一、 实验室名称:软件实验室二、 实验项目名称:数据结构与算法一快速排序与二分查找三、 实验学时:4四、 实验原理:快速排序的基本思想是:通过一躺排序将要 排序的数据分割成独立的两部分,其中一部分的 所有数据都比另外一不部分的所有数据都要小, 然后再按次方法对这两部分数据分别进行快速 排序,整个排序过程可以递归进行,以此达到整 个数据变成有序序列。假设要排序的数组是A1AN,首先 任意选取一个数据(通常选用第一个数据)作为 关键数据,然后将所有比它的数都放到它前面, 所有比它大的数都放到它后面,这个过程称为一 躺快速排序。一躺快速排序的算法是:1)设置两个变量
2、I、J,排序开始的时候I : =1,J : =N2) 以第一个数组元素作为关键数据,赋值给 X,即 X: =A1;3) 从J开始向前搜索,即(J : =J-1),找到 第一个小于X的值,两者交换;4) 从I开始向后搜索,即(I: =1+1),找到 第一个大于X的值,两者交换;5) 重复第3、4步,直到I=J。二分法查找(折半查找)的基本思想:(1) 确定该区间的中点位置:mid=(low+high ) /2min代表区间中间的结点的位置,low代表区间 最左结点位置,high代表区间最右结点位置(2) 将待查a值与结点mid的关键字(下面 用Rmid.key )比较,若相等,则查找成功,否 则
3、确定新的查找区间:A) 如果Rmid.keya,则由表的有序性可 知,Rmid.key右侧的值都大于a,所以等于a 的关键字如果存在,必然在 Rmid.key左边的 表中,这时high=mid-1;B) 如果Rmid.keya,则等于a的关键字如 果存在,必然在 Rmid.key右边的表中。这时 low=mid ;C)如果Rmid.key=a,则查找成功。(3) 下一次查找针对新的查找区间, 重复步 骤(1)和(2)(4) 在查找过程中,low逐步增加,high逐 步减少,如果highlow,则查找失败。五、 实验目的:本实验通过实现快速排序和折半查找算法,使学生理解如何实现快速查找和排序的基
4、本算法思想。通过练习,加强对算法的理解,提高编程能力。六、 实验内容:(1) 实现数据序列的输入;(2) 实现快速排序算法,并对输入的序列排序后输出;(3) 实现折半查找算法,并在步骤(2)排序后的序列上,进行任意地 查找,并输出查询结果。七、 实验器材(设备、元器件):PC机一台,装有C/C+语言集成开发环境。八、数据结构及程序/* 陈 家 浩*#include#define MAX 100int DataMAX+1 = 0;intQuick_Part(intData,inti,int j);/一趟排序Quick_Sort(ints,int t);/递归排Quick_Find(intdata
5、,intn);/二分查找int main(void)Iint choose = -1 int i,k,data; / 选择功能int n; /数据序列长度while(1)printf(+ 排序与查找 - +n|1:输入数据序列|n2:序列排序3:查找信息0:退出+ + +n 请选择: ); scanf(%d,&choose);switch(choose)case 1: 请输入序列数据个数:scanf(if(nMAX) 数据过多 !nn break;else 请输入数据序列: nfor(i = 1;i = n;i+) scanf(Datai); 读取成功! nnbreak;case 2:Quic
6、k_Sort(Data,1,n); / 快速排序 排序成功!序列如下: for(i = 1;i+)%d ,Datai); printf(case 3: 请输入待查找的数据:data);k = Quick_Find(Data,data,n); / 二分法查找if(k) 查找成功!数据 %d 位于序 列第 %d 位。,data,k);else 查找失败!没有你要查找的数 据! default:return 0;int Quick_Part(int Data,int i,int j) / 快速排序Data0 = Datai;while(i j)while(i j) & (Data0 = Dataj)
7、j -; / 右边目标元比划分元大, j 往左移if(i Datai = Dataj; /比划分元小的关键 字交换到左边i +; while(i = Datai) / 左边目标元比划分元小, i 往右移Dataj = Datai; /比划分元大的关键 字交换到右边Datai = Data0; / 划分元存入正/返回划分元确位置return i;的位置int Quick_Sort(int Data,int s,int t)int i = Quick_Part(Data,s,t); / 调用划分过程 将顺序表分成两部分if(is)Quick_Sort(Data,s,i-1); /递归调用排序if(
8、it)Quick_Sort(Data,i+1,t); / 递归调用排序/二分查int Quick_Find(int Data,int data,int n) 找int low = 1; int high = n;int mid;/中间位置/查找成功返回while(low Datamid) low = mid +1;high = mid -1;II查找失败返回0九、程序运行结果:十、实验结论:通过实现快速排序和折半查找算法, 基本达到了实验目的。快速排序的基本 思想是每次确定一个划分元,将比划分元大的数据存储到划分元右边,比他小 的存储到他左边,通过递归排序实现整个顺序表的排序。然而,其中的递归调 用很难,需要思考其中参数的变化,这需要细心。十一、总结及心得体会:1对错误输入的解决方案还有待完善;2快速排序递归调用结束的条件需要慎重考虑,否则极易陷入死循环。例 如课本上的while(svt)结束条件,第一次递归的s,t根本不会发生改变,以至于 程序进入了死循环;3、 顺序表的存储方式可以有多种, 这里为了方便采用了整形数组方式存储, 当然也可以用结构数组来存储;4、 函数的返回值作用很大,要仔细决定;5、 实验虽然简单,淡水在以后的各个方面都会用到,所以应仔细完成,深 刻理解内容。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1