算法设 第二章 排序算法.docVIP

  • 5
  • 0
  • 约1.33万字
  • 约 21页
  • 2017-02-05 发布于湖北
  • 举报
实验报告 实验目的:理解递归算法的基本思想和递归程序的执行过程,并熟悉编写递归算法。掌握递归算法的思想,对给定的问题能设计出分治算法予以解决。 实验内容:编程实现讲过的例题:二分搜索、合并排序、快速排序。 实验过程: 1.二分搜索: 1.1问题描述 在对线性表的操作中,经常需要查找某一个元素在线性表中的位置。此问题的输入是待查找元素x和线性表L,输出x在L中的位置或者x不在L中的信息。 1.2算法分析 (1)首先将链表中第一个元素给参数low,最后一个元素给参量high; (2)在lowhigh的条件下: 取d=(low+high)/2; 若所查找元素第d个元素:则将d赋值给参量high; 若所查找元素第d个元素:则将d+1赋值给参量high; 继续在low与high的范围内查找;找到则输出。 (3)当不满足 lowhigh的条件时:输出没有查找到此元素。 1.3程序框图 假定要搜索x=9: 1 4 5 7 8 9 10 12 15 22 23 27 32 35 1 4 5 7 8 9 10 8 9 10 ↑ 2. 合并排序 2.1问题描述 假定有一个数组A[1…m]p.q.r是它的三个索引,并且有1=p=qr=m,两个子数组A[p…q] A[q+1…r]各自按升序排列。我们要重新安排A中的元素的位置,使得子数组A[p…r]也按升序排列。 2.2算法思想 ⑴.使用两个指针s.t.初始化时各自指向A[p] A[p+1],再用一个空数组 B[p…r]作暂存器。 ⑵.每一次比较元素A[s].A[t],将小的元素添加到辅助数组B[p…r]中,如果相同就把A[s]添加进去。同时更新指针,若添加是A[s],则s++;若添加是A[t],则t++; ⑶.当条件s=q+1 or t=q+1时过程结束,在前一种情况下把数组A[t…r]中剩余的元素添加到在B中. 在后一种情况下把数组A[s…q]中剩余的元素添加到在B中. ⑷.最后,把数组B[p…q]复制到A[p…r]. 2.3程序框图 如图:给出有序数组两个: 7 8 9 10 7 8 9 10 10 12 15 10 12 15 3. 快速排序 3.1问题描述 假定有一个数组A[1…m].其中的元素为无序排列;我们要重新安排A中的元素的位置,使得子数组A[p…r]也按升序排列。 3.2算法思想 (1)首先将链表中第一个元素给参数low,最后一个元素给参量high; (2)在lowhigh的条件下: 将low与high之间的元素以low元素为轴,比low小的元素交换到low以前;比low大的元素交换到low以后。此时得到一个以low为轴的划分,然后分别对low前和其后的数列再进行划分,直到数列成为单个元素,此时完成排序; (3)程序用递归实现。 3.3程序框图 5 7 1 6 4 8 3 2 ↑ ↑ i j 5 1 7 6 4 8 3 2 ↑ ↑ i j 5 1 4 6 7 8 3 2 ↑ ↑ i j 5 1 4 3 7 8 6 2 ↑ ↑ i j 5 1 4 3 2 8 6 7 ↑ ↑ i j 2 1 4 3 5 8 6 7 ↑ ↑ i j 4.程序源代码: (说明:我是将本试验的的三个小试验放在同一个函数中实现: 首先从文件“data.txt”中读取无序数列存入动态数组中,然后进行快速排序,再读入数据进行合并排序,然后对此有序数列进行二分查找) #includestdio.h #includemath.h #includestdlib.h int *L,*C; int Num; int tag=0; void readindata() { FILE *fpin; int a,i=0; if((fpin=fopen(data.txt,r))==NULL) { printf(Can not open!); exit(0); } while(!feof(fpin)) { fscanf(fpin,%d,a); i++; } Num=i; rewind(fpin); L=(int*)malloc(sizeof(int)*(Num+1)); for(i=1;i=Num;i++) { fscanf(fpin,%d,a); *(L+i)=a; } } int Partition(int low,int high)

文档评论(0)

1亿VIP精品文档

相关文档