当前位置:文档之家› 三分查找技术

三分查找技术

三分查找技术
三分查找技术

【标准化说明】三分查找技术与简单应用

三分查找技术适用于答案在某一个区间内,这个区间的特点的是,以答案为分点的两侧区间都单调的增大或者减小:

如右图就是一个分的例子:

三分的区间为[l,r]其中最低点为答案

每次把区间分为3个等分

取x1=l+(r-l)/3 ,x2=r-(r-l)/3 作为分点,看谁更接近标准答案,

并以此来更新左右区间,继续进行二分,直到得到(无限逼

近)答案。

Trick or Treat

Description

Johnny and his friends have decided to spend Halloween night doing the usual candy collection from the households of their village. As the village is too big for a single group to collect the candy from all houses sequentially, Johnny and his friends have decided to split up so that each of them goes to a different house, collects the candy (or wreaks havoc if the residents don't give out candy), and returns to a meeting point arranged in advance.

There are n houses in the village, the positions of which can be identified with their Cartesian coordinates on the Euclidean plane. Johnny's gang is also made up of n people (including Johnny himself). They have decided to distribute the candy after everybody comes back with their booty. The houses might be far away, but Johnny's interest is in eating the candy as soon as possible.

Keeping in mind that, because of their response to the hospitality of some villagers, some children might be wanted by the local authorities, they have agreed to fix the meeting point by the river running through the village, which is the line y = 0. Note that there may be houses on both sides of the river, and some of the houses may be houseboats (y = 0). The walking speed of every child is 1 meter per second, and they can move along any direction on the plane.

At exactly midnight, each child will knock on the door of the house he has chosen, collect the candy instantaneously, and walk back along the shortest route to the meeting point. Tell Johnny at what time he will be able to start eating the candy.

Input

Each test case starts with a line indicating the number n of houses ( 1n50 000). The next n lines describe the positions of the houses; each of these lines contains two floating point numbers x and y ( -200 000 x, y 200 000), the coordinates of a house in meters. All

houses are at different positions.

A blank line follows each case. A line with n = 0 indicates the end of the input; do not write any output for this case.

Output

For each test case, print two numbers in a line separated by a space: the coordinate x of the meeting point on the line y = 0 that minimizes the time the last child arrives, and this time itself (measured in seconds after midnight). Your answer should be accurate to within an absolute or relative error of 10-5.

Sample Input

2

1.5 1.5

3 0

1

0 0

4

1 4

4 4

-3 3

2 4

5

4 7

-4 0

7 -6

-2 4

8 -5

Sample Output

1.500000000 1.500000000

0.000000000 0.000000000

1.000000000 5.000000000

3.136363636 7.136363636

Source

Southwestern 2009-2010

#include

#include

#include

#include

using namespace std;

constintmax_size=50001;

structpoint_type

{

doublex,y;

};

int n;

point_type point[max_size];

doublel,r; //l-most left point (x_door) r-most right point (x_door) intcnt;

voidinit()

{

cnt=0;

int i;

for (i=1;i<=n;i++)

scanf("%lf %lf",&point[i].x,&point[i].y);

l=r=point[1].x;

for (i=2;i<=n;i++)

{

if (point[i].x

if (point[i].x>r) r=point[i].x;

}

}

double E(double x)

{

return x*x;

}

doublecalc(double x)

{

int i;

double temp=0;

for (i=1;i<=n;i++)

if (sqrt(E(point[i].x-x)+E(point[i].y))>temp) temp=sqrt(E(point[i].x-x)+E(point[i].y)); return temp;

}

void solve()

{

double _lp,_rp;

doubledist_l,dist_r;

for (;r-l>10e-12;)

{

if (++cnt>=64) break;

_lp=l+(r-l)/3;

_rp=r-(r-l)/3;

dist_l=calc(_lp);

dist_r=calc(_rp);

if (dist_l>dist_r)

l=_lp;

else if (dist_l

r=_rp;

else

{

l=_lp;

r=_rp;

}

}

}

void print()

{

printf("%.9lf %.9lf\n" , l , calc(l));

}

int main()

{

for (;;)

{

scanf("%d",&n);

if (n==0) return 0;

init();

solve(); print();

} }

《数据结构》实验报告——排序.docx

《数据结构》实验报告排序实验题目: 输入十个数,从插入排序,快速排序,选择排序三类算法中各选一种编程实现。 实验所使用的数据结构内容及编程思路: 1. 插入排序:直接插入排序的基本操作是,将一个记录到已排好序的有序表中,从而得到一个新的,记录增一得有序表。 一般情况下,第i 趟直接插入排序的操作为:在含有i-1 个记录的有序子序列r[1..i-1 ]中插入一个记录r[i ]后,变成含有i 个记录的有序子序列r[1..i ];并且,和顺序查找类似,为了在查找插入位置的过程中避免数组下标出界,在r [0]处设置哨兵。在自i-1 起往前搜索的过程中,可以同时后移记录。整个排序过程为进行n-1 趟插入,即:先将序列中的第一个记录看成是一个有序的子序列,然后从第2 个记录起逐个进行插入,直至整个序列变成按关键字非递减有序序列为止。 2. 快速排序:基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 假设待排序的序列为{L.r[s] ,L.r[s+1],…L.r[t]}, 首先任意选取一个记录 (通常可选第一个记录L.r[s])作为枢轴(或支点)(PiVOt ),然后按下述原则重新排列其余记录:将所有关键字较它小的记录都安置在它的位置之前,将所有关键字较大的记录都安置在它的位置之后。由此可以该“枢轴”记录最后所罗的位置i 作为界线,将序列{L.r[s] ,… ,L.r[t]} 分割成两个子序列{L.r[i+1],L.[i+2], …,L.r[t]}。这个过程称为一趟快速排序,或一次划分。 一趟快速排序的具体做法是:附设两个指针lOw 和high ,他们的初值分别为lOw 和high ,设枢轴记录的关键字为PiVOtkey ,则首先从high 所指位置起向前搜索找到第一个关键字小于PiVOtkey 的记录和枢轴记录互相交换,然后从lOw 所指位置起向后搜索,找到第一个关键字大于PiVOtkey 的记录和枢轴记录互相 交换,重复这两不直至low=high 为止。 具体实现上述算法是,每交换一对记录需进行3 次记录移动(赋值)的操作。而实际上,

数据结构及应用算法教程习题第三章 排序

第三章排序 一、选择题 1.某内排序方法的稳定性是指( D )。 A.该排序算法不允许有相同的关键字记录、 B.该排序算法允许有相同的关键字记录 C.平均时间为0(n log n)的排序方法 D.以上都不对 2.下面给出的四种排序法中( )排序法是不稳定性排序法。 A. 插入 B. 冒泡 C. 二路归并 D. 快速排序3.下列排序算法中,其中( CD )是稳定的。 A. 堆排序,冒泡排序 B. 快速排序,堆排序 C. 直接选择排序,归并排序 D. 归并排序,冒泡排序 6.若要求尽可能快地对序列进行稳定的排序,则应选( B )。 A.快速排序 B.归并排序 C.冒泡排序 12.排序趟数与序列的原始状态有关的排序方法是( D )排序法。 A.插入 B. 选择 C. 冒泡 D. 快速 17.数据序列(8,9,10,4,5,6,20,1,2)只能是下列排序算法中的( C )的两趟排序后的结果。 A.选择排序 B.冒泡排序 C.插入排序 18.数据序列(2,1,4,9,8,10,6,20)只能是下列排序算法中的( A )的两趟排序后的结果。 A. 快速排序 B. 冒泡排序 C. 选择排序 D. 插入排序19.对一组数据(84,47,25,15,21)排序,数据的排列次序在排序的过程中的变化为(1) 84 47 25 15 21 (2) 15 47 25 84 21 (3) 15 21 25 84 47 (4) 15 21 25 47 84,则采用的排序是 ( A )。 A. 选择 B. 冒泡 C. 快速 D. 插入24.下列序列中,( D )是执行第一趟快速排序后所得的序列。 A. [68,11,18,69] [23,93,73] B. [68,11,69,23] [18,93,73] C. [93,73] [68,11,69,23,18]

(完整word版)查找、排序的应用 实验报告

实验七查找、排序的应用 一、实验目的 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,查找成功 若keyr[mid].key,则low=mid+1 重复上述操作,直至low>high时,查找失败 b、顺序查找 从表的一端开始逐个进行记录的关键字和给定值的比较。在这里从表尾开始并把下标为0的作为哨兵。 void chaxun(SqList &ST) //查询信息 { cout<<"\n************************"<=1;j--) if(ST.r[j].xuehao

实验报告-排序与查找

电子科技大学实验报告 课程名称:数据结构与算法 学生姓名: 学号: 点名序号: 指导教师: 实验地点:基础实验大楼 实验时间: 5月20日 2014-2015-2学期 信息与软件工程学院

实验报告(二) 学生姓名学号:指导教师: 实验地点:基础实验大楼实验时间:5月20日 一、实验室名称:软件实验室 二、实验项目名称:数据结构与算法—排序与查找 三、实验学时:4 四、实验原理: 快速排序的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 假设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序。一躺快速排序的算法是: 1)设置两个变量I、J,排序开始的时候I:=1,J:=N 2)以第一个数组元素作为关键数据,赋值给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)/2 min代表区间中间的结点的位置,low代表区间最左结点位置,high代表区间最右结点位置(2)将待查a值与结点mid的关键字(下面用R[mid].key)比较,若相等,则查找成功,否则确定新的查找区间: A)如果R[mid].key>a,则由表的有序性可知,R[mid].key右侧的值都大于a,所以等于a的关键字如果存在,必然在R[mid].key左边的表中,这时high=mid-1; B)如果R[mid].key

动态查找表实验报告材料

动态查找表实验报告 一. 1 、实验概要 实验项目名称: 抽象数据类型的实现 实验项目性质: 设计性实验 所属课程名称: 数据结构 实验计划学时: 6 2、实验目的 对某个具体的抽象数据类型,运用课程所学的知识和方法,设计合理的数据结构,并在此基础上实现该抽象数据类型的全部基本操作。通过本设计性实验,检验所学知识和能力,发现学习中存在的问题。进而达到熟练地运用本课程中的基础知识及技术的目的。 实验要求如下: 1.参加实验的学生应首先了解设计的任务,然后根据自己的基础和能力从中选择一题。一般来说,选择题目应以在规定的时间内能完成,并能得到应有的锻炼为原则。若学生对教材以外的相关题目较感兴趣,希望选作实验的题目时,应征得指导教师的认可,并写出明确的抽象数据类型定义及说明。 2. 实验前要作好充分准备,包括:理解实验要求,掌握辅助工具的使用,了解该抽象数据类型的定义及意义,以及其基本操作的算法并设计合理的存储结构。 3. 实验时严肃认真,要严格按照要求独立进行设计,不能随意更改。注意观察并记录各种错误现象,纠正错误,使程序满足预定的要求,实验记录应作为实验报告的一部分。 4. 实验后要及时总结,写出实验报告,并附所打印的问题解答、程序清单,所输入的数据及相应的运行结果。 所用软件环境或工具:DEV-C++5可视化编程环境. 3.动态查找表的抽象数据类型 ADT DynamicSearchTable { 数据对象D:D是具有相同特性的数据元素的集合。每个数据元素含有类型相同的关键字,可唯一 标识数据元素。 数据关系R:数据元素同属一个集合。 基本操作P: InitDSTable(&DT); 操作结果:构造一个空的动态查找表DT。 DestroyDSTable(&DT); 初始条件:动态查找表DT存在; 操作结果:销毁动态查找表DT。 SearchDSTable(DT, key); 初始条件:动态查找表DT存在,key为和关键字类型相同的给定值; 操作结果:若DT中存在其关键字等于key的数据元素,则函数值为该元素的值或在表中的

查找与排序实验报告

实验四:查找与排序 【实验目的】 1.掌握顺序查找算法的实现。 2.掌握折半查找算法的实现。 【实验内容】 1.编写顺序查找程序,对以下数据查找37所在的位置。 5,13,19,21,37,56,64,75,80,88,92 2.编写折半查找程序,对以下数据查找37所在的位置。 5,13,19,21,37,56,64,75,80,88,92 【实验步骤】 1.打开VC++。 2.建立工程:点File->New,选Project标签,在列表中选Win32 Console Application,再在右边的框里为工程起好名字,选好路径,点OK->finish。 至此工程建立完毕。 3.创建源文件或头文件:点File->New,选File标签,在列表里选C++ Source File。给文件起好名字,选好路径,点OK。至此一个源文件就被添加到了你刚创建的工程之中。 4.写好代码 5.编译->链接->调试 #include "stdio.h" #include "malloc.h" #define OVERFLOW -1 #define OK 1 #define MAXNUM 100 typedef int Elemtype; typedef int Status; typedef struct {

Elemtype *elem; int length; }SSTable; Status InitList(SSTable &ST ) { int i,n; ST.elem = (Elemtype*) malloc (MAXNUM*sizeof (Elemtype)); if (!ST.elem) return(OVERFLOW); printf("输入元素个数和各元素的值:"); scanf("%d\n",&n); for(i=1;i<=n;i++) { scanf("%d",&ST.elem[i]); } ST.length = n; return OK; } int Seq_Search(SSTable ST,Elemtype key) { int i; ST.elem[0]=key; for(i=ST.length;ST.elem[i]!=key;--i); return i; } int BinarySearch(SSTable ST,Elemtype key) { int low,high,mid; low=1; high=ST.length;

顺序表的查找、插入与删除实验报告

《数据结构》实验报告一 学院:班级: 学号:姓名: 日期:程序名 一、上机实验的问题和要求: 顺序表的查找、插入与删除。设计算法,实现线性结构上的顺序表的产生以及元素的查找、插入与删除。具体实现要求: 1.从键盘输入10个整数,产生顺序表,并输入结点值。 2.从键盘输入1个整数,在顺序表中查找该结点的位置。若找到,输出结点的位置;若找 不到,则显示“找不到”。 3.从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插 入在对应位置上,输出顺序表所有结点值,观察输出结果。 4.从键盘输入1个整数,表示欲删除结点的位置,输出顺序表所有结点值,观察输出结果。 二、源程序及注释: #include #include /*顺序表的定义:*/ #include #define ListSize 100 /*表空间大小可根据实际需要而定,这里假设为100*/ typedef int DataType; /*DataType可以是任何相应的数据类型如int, float或char*/ typedef struct { DataType data[ListSize]; /*向量data用于存放表结点*/ int length; /*当前的表长度*/ }SeqList; void main() { SeqList L; int i,x; int n=10; /*欲建立的顺序表长度*/ L.length=0; void CreateList(SeqList *L,int n); void PrintList(SeqList L,int n); int LocateList(SeqList L,DataType x); void InsertList(SeqList *L,DataType x,int i); void DeleteList(SeqList *L,int i);

第三章整理

(三) 1单选(2分) 关于问题与问题求解,下列说法正确的是()。 A.在问题求解中,提出假设就是对问题求解结果的一种假设。 B.问题求解是人们为寻求问题答案而进行的一系列思维活动。 C.问题是客观存的,提出问题与发现问题与人对事情的好奇心和求知欲无关。 D.所有问题都是有科学研究价值的。 E.人类进行问题求解的一般思维过程可分为问题分析、提出假设和检验假设。 F.问题的发现与人的好奇心和求知欲有关,与人的知识和经验无关。 正确答案:B、E 2单选(2分) 关于贪心算法,下列叙述中正确的是()。 A.贪心算法所做出的选择只是在某种意义上的局部最优选择。 B.贪心算法并不从整体最优考虑。 C.贪心算法无法求得问题的最优解。 D.贪心算法的时间效率最高。 E.选择能产生问题最优解的最优量度标准是使用贪婪算法的核心。 正确答案:A、E 3单选(2分) 关于数学模型(Mathematical Model)和数学建模(Mathematical Modeling),下列说法正确的是()。 A.数学建模包括模型准备、模型假设和模型建立三个基本步骤。 B.数学模型是问题求解的逻辑模型,与时间变量无关。 C.数学模型是研究和掌握系统运动规律的有力工具,可以对实际问题进行分析、预测和求解。 D.数学建模是对实际问题进行抽象、提炼出数学模型的过程。 E.数学模型是对实际问题的数学抽象,是用数学符号、数学式子等对实际问题本质属性的抽象而又简洁的刻画。正确答案:D、E 4单选(2分)

关于问题的算法复杂性,下列叙述正确的是()。 A.NP问题就是时间复杂性为O(2n)的问题。 B.NP问题都是不可解的。 C.问题求解算法的时间复杂度是该问题实例规模n的多项式函数,则这种可以在多项式时间内解决的问题称为P类问题。 D.NP问题虽然不能在多项式时间内求解,但对于所有解,都可以在多项式时间内验证它是否为问题的解。 E.NP问题就是时间复杂性为O(n!)的问题。 F.不能在多项式时间内求解的问题为NP问题。 正确答案:C、F 5单选(2分) 设数据表共有n=10个元素,其关键值为{2,5,6,10,15,21,26,30,56,78},要查找的关键字为K=30,则查找成功时,所做的比较操作的次数是()。 A.8次 B.3次 C.2次 D.1次 E.4次 正确答案:C 6单选(2分) 关于算法(Algorithm),下列叙述正确的是()。 A.在算法设计中,设计师和程序员之间采用流程图工具。 B.在算法描述中,自然语言、流程图和伪代码不能混合使用。 C.算法是问题求解方法及求解过程的描述。 D.自然语言描述常用于细节的描述。 E.在算法设计中,用户和分析师常采用伪代码描述算法,沟通思想。 正确答案:C 7单选(2分)

河南工业大学实验报告——查找和排序(排序)——张伟龙

河南工业大学实验报告 课程名称数据结构实验项目实验三查找和排序(二)——排序院系信息学院计科系专业班级计科1203 姓名张伟龙学号 201216010313 指导老师范艳峰日期 2013.6.5 批改日期成绩 一实验目的 掌握希尔排序、快速排序、堆排序的算法实现。 二实验内容及要求 实验内容:1.实现希尔排序。 2.实现快速排序。 3. 实现堆排序。 (三选一) 实验要求:1. 根据所选题目,用C语言编写程序源代码。 2. 源程序必须编译调试成功,独立完成。 三实验过程及运行结果 选择第三题: Source Code: #include #include using namespace std; void HeapAdjust(int *a,int i,int size) //调整堆 { int lchild=2*i; //i的左孩子节点序号

int rchild=2*i+1; //i的右孩子节点序号 int max=i; //临时变量 if(i<=size/2) //如果i是叶节点就不用进行调整 { if(lchild<=size&&a[lchild]>a[max]) { max=lchild; } if(rchild<=size&&a[rchild]>a[max]) { max=rchild; } if(max!=i) { swap(a[i],a[max]); HeapAdjust(a,max,size); //避免调整之后以max为父节点的子树不是堆 } } } void BuildHeap(int *a,int size) //建立堆 { int i; for(i=size/2;i>=1;i--) //非叶节点最大序号值为size/2 { HeapAdjust(a,i,size); } }

《数据结构》实验报告查找

实验四——查找 一、实验目的 1.掌握顺序表的查找方法,尤其是折半查找方法; 2.掌握二叉排序树的查找算法。 二、实验内容 1.建立一个顺序表,用顺序查找的方法对其实施查找; 2.建立一个有序表,用折半查找的方法对其实施查找; 3.建立一个二叉排序树,根据给定值对其实施查找; 4.对同一组数据,试用三种方法查找某一相同数据,并尝试进行性能分析。 三、实验预习内容 实验一包括的函数有:typedef struct ,创建函数void create(seqlist & L),输出函数void print(seqlist L),顺序查找int find(seqlist L,int number),折半查找int halffind(seqlist L,int number) 主函数main(). 实验二包括的函数有:结构体typedef struct,插入函数void insert(bnode * & T,bnode * S),void insert1(bnode * & T),创建函数void create(bnode * & T),查找函数bnode * search(bnode * T,int number),主函数main(). 四、上机实验 实验一: 1.实验源程序。 #include<> #define N 80 typedef struct { int number; umber; for(i=1;[i].number!=0;) { cin>>[i].name>>[i].sex>>[i].age; ++; cout<>[++i].number; } } umber<<"\t"<<[i].name<<"\t"<<[i].sex<<"\t"<<[i].age<

查找排序实验报告

《编程实训》 实验报告书 专业:计算机科学与技术 班级:151班 学号: 姓名: 指导教师: 日期:2016年6月30日

目录 一、需求分析 (3) 1.任务要求 (3) 2.软件功能分析 (3) 3.数据准备 (3) 二、概要设计 (3) 1.功能模块图 (4) 2.模块间调用关系 (4) 3.主程序模块 (5) 4.抽象数据类型描述 (5) 三、详细设计 (6) 1.存储结构定义 (6) 2.各功能模块的详细设计 (7) 四、实现和调试 (7) 1.主要的算法 (7) 2.主要问题及解决 (8) 3.测试执行及结果 (8) 五、改进 (9) 六、附录 (9) 1.查找源程序 (9) 2.排序源程序 (9)

目录 1 需求分析 1.1 任务要求 对于从键盘随机输入的一个序列的数据,存入计算机内,给出各种查找算法的实现; 以及各种排序算法的实现。 1.2 软件功能分析 任意输入n个正整数,该程序可以实现各类查找及排序的功能并将结果输出。 1.3 数据准备 任意输入了5个正整数如下: 12 23 45 56 78 2 概要设计(如果2,3合并可以省略2.4) 2.1 功能模块图(注:含功能说明) 2.2 模块间调用关系 2.3 主程序模块 2.4 抽象数据类型描述 存储结构:数据结构在计算机中的表示(也称映像)叫做物理结构。又称为存储结构。数据类型(data type)是一个“值”的集合和定义在此集合上的一组操作的总称。 3 详细设计 3.1 存储结构定义 查找: typedef int ElemType ; //顺序存储结构 typedef struct { ElemType *elem; //数据元素存储空间基址,建表时按实际长度分配,号单元留空 int length; //表的长度

2018年浙江省选考信息技术查找与排序强化习题一答案

第二轮排序和查找算法综合1 行政班:教学班:姓名:学号: 根据课本上的排序算法和查找算法回答1-6题: 1.【加试题】有一个数组,采用冒泡排序,第一遍排序后的结果为:4,10,5,32,6,7,9,17,24那么该数组的原始顺序不可能 ...的是() A.10,5,32,6,7,9,17,24,4 B.10,5,32,6,7,9,4,17,24 C.10,5,32,4,6,7,9,17,24 D.4,10,5,32,17,9,24,6,7 2.【加试题】对下列数据序列进行冒泡升序排序,排序效率最低的序列() A.31,29,24,20,15,10 B.10,15,20,24,29,31 C.29,10,31,15,20,24 D.24,29,31,20,15,10 3.【加试题2】数组变量d(1)到d(8)的值依次为87、76、69、66、56、45、37、23,用“对分查找”找到“69”的过程中,依次被访问到的数据是() A.69 B.66、69 C.66、76、69 D.56、66、76、69 4.【加试题2】用对分查找法和顺序查找法在数字序列“1,2,3,5,8,13,21,34,55”中查找数字13,两种方法都能访问到的数字是() A.3 B.5 C.8 D.34 5.【加试题2】在有序单词序列“bike,cake,data,easy,feel,great,hive,mark,sweet”中,用对分查找算法找到“easy”过程中,依次被访问到的数据为() A.feel, data, easy B.great, data, easy C.bike, cake, dada,easy D.feel,cake,data,easy 6.【加试题2】下列有关查找的说法,正确的是() A.进行对分查找时,被查找的数据必须已按升序排列 B.进行对分查找时,如果查找的数据不存在,则无需输出结果 C.在新华字典中查找某个汉字,最适合使用顺序查找 D.对规模为n的数据进行顺序查找,平均查找次数是21 n 7. 【加试题】实现某排序算法的部分VB程序如下:数组元素a(1)到a(5)的数据依次为“38,70,53,57,30”。经过下列程序“加工”后数组元素a(1)到a(5)的数据应该是() For i = 1 To 1 For j = 5 To i + 1 Step -1 If a(j) > a(j - 1) Then t = a(j) a(j) = a(j - 1) a(j - 1) = t End If Next j Next i 命题:杜宗飞 A.70,57,38,53,30 B.30, 38,70,53,57 C.70,38,57,53,30 D.30, 38,57,53,70 8.【加试题】有如下程序段: For i = 1 To 2

各种排序实验报告

【一】需求分析 课程题目是排序算法的实现,课程设计一共要设计八种排序算法。这八种算法共包括:堆排序,归并排序,希尔排序,冒泡排序,快速排序,基数排序,折半插入排序,直接插入排序。 为了运行时的方便,将八种排序方法进行编号,其中1为堆排序,2为归并排序,3为希尔排序,4为冒泡排序,5为快速排序,6为基数排序,7为折半插入排序8为直接插入排序。 【二】概要设计 1.堆排序 ⑴算法思想:堆排序只需要一个记录大小的辅助空间,每个待排序的记录仅占有一个存储空间。将序列所存储的元素A[N]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中任一非叶结点的元素均不大于(或不小于)其左右孩子(若存在)结点的元素。算法的平均时间复杂度为O(N log N)。 ⑵程序实现及核心代码的注释: for(j=2*i+1; j<=m; j=j*2+1) { if(j=su[j]) break; su[i]=su[j]; i=j; } su[i]=temp; } void dpx() //堆排序 { int i,temp; cout<<"排序之前的数组为:"<=0; i--) { head(i,N); } for(i=N-1; i>0; i--) {

temp=su[i]; su[i]=su[0]; su[0]=temp; head(0,i-1); } cout<<"排序之后的数组为:"<

查询与排序 实验报告

学院专业班学号 协作者_____________教师评定_________________ 实验题目查询与排序 综合实验评分表

实验报告 一、实验目的与要求 1、掌握散列表的构造及实现散列查找; 2、掌握堆排序的算法; 3、综合比较各类排序算法的性能。 二、实验容 #include"stdio.h" #include"stdlib.h" #include"string.h" #include"windows.h" #define MAX 20 typedef struct{ unsigned long key; int result; char name[30];}RNode; RNode t[MAX],r[MAX]; int h(unsigned long k) /*散列函数*/ { return((k-3109005700)%11); } void insert(RNode t[],RNode x) /*插入函数,以线性探查方法解决冲突*/ {

int i,j=0; i=h(x.key); while((j0)) j++; if(j==MAX) printf("full\n"); i=(i+j)%MAX; if(t[i].key==0) {t[i]=x;} else { if(t[i].key==x.key) printf("记录已存在!\n"); } } int search(RNode t[],unsigned long k) /*插入函数,以线性探查方法解决冲突*/ { int i,j=0; i=h(k); while((j

查找排序习题讲解

第7章查找 【例7-1】有序表按关键字排列如下:7,14,18,21,23,29,31,35,38,42,46,49,52,在表中查找关键字为14和22的数据元素,并画出折半查找过程的判定树。 解:折半查找的过程描述如下: ①low=1;high=length;//设置初始区间 ②当low>high时,返回查找失败信息//表空,查找失败 ③low≤high,mid=(low+high)/2; //取中点 a. 若kxtbl.elem[mid].key,low=mid+1;转②//查找在右半区进行 c. 若kx=tbl.elem[mid].key,返回数据元素在表中位置//查找成功 ●查找关键字为14的过程如下: low=1 ①设置初始区间high=13 ─────────────────────────── ↑②表空测试,非空; mid=7 ③得到中点,比较测试为a情形 ↑↑ low=1 high=6 high=mid-1,调整到左半区 ──────────────────────────── ↑②表空测试,非空; mid=3 ③得到中点,比较测试为a情形 ↑↑ low=1 high=2 high=mid-1,调整到左半区 ──────────────────────────── ↑②表空测试,非空; mid=1 ③得到中点,比较测试为b情形 ↑↑ low=2 high=2 low=mid+1,调整到右半区 ──────────────────────────── ↑②表空测试,非空; mid=2 ③得到中点,比较测试为c情形 查找成功,返回找到的数据元素位置为2 ●查找关键字为22的过程如下: low=1 ①设置初始区间high=13 ──────────────────────────── ↑②表空测试,非空; mid=7 ③得到中点,比较测试为a情形 ↑↑ low=1 high=6 high=mid-1,调整到左半区 ─────────────────────────── ↑②表空测试,非空; mid=3 ③得到中点,比较测试为b情形

河南工业大学实验报告_实验三 查找和排序(一)——查找

xxx大学实验报告 课程名称数据结构实验项目实验三查找和排序(一)——查找 院系信息学院计类系专业班级计类1501 姓名学号 指导老师日期 批改日期成绩 一实验目的 1.掌握哈希函数——除留余数法的应用; 2. 掌握哈希表的建立; 3. 掌握冲突的解决方法; 4. 掌握哈希查找算法的实现。 二实验内容及要求 实验内容:已知一组关键字(19,14,23,1,68,20,84,27,55,11,10,79),哈希 函数定义为:H(key)=key MOD 13, 哈希表长为m=16。实现该哈希表的散列,并 计算平均查找长度(设每个记录的查找概率相等)。 实验要求:1. 哈希表定义为定长的数组结构;2. 使用线性探测再散列或链 地址法解决冲突;3. 散列完成后在屏幕上输出数组内容或链表;4. 输出等概率 查找下的平均查找长度;5. 完成散列后,输入关键字完成查找操作,要分别测 试查找成功与不成功两种情况。 注意:不同解决冲突的方法会使得平均查找长度不同,可尝试使用不同解决 冲突的办法,比较平均查找长度。(根据完成情况自选,但至少能使用一种方法 解决冲突) 三实验过程及运行结果 #include #include #include #define hashsize 16

#define q 13 int sign=2; typedef struct Hash { int date; //值域 int sign; //标记 }HashNode; void compare(HashNode H[],int p,int i,int key[]) //线性冲突处理{ p++; if(H[p].sign!=0) { sign++; compare(H,p,i,key); } else { H[p].date=key[i]; H[p].sign=sign; sign=2; } } void Hashlist(HashNode H[],int key[]) { int p; for(int i=0;i<12;i++) { p=key[i]%q; if(H[p].sign==0) { H[p].date=key[i]; H[p].sign=1; } else compare(H,p,i,key); } } int judge(HashNode H[],int num,int n) //查找冲突处理 {

第3章 排序答案

第3章排序自测卷答案姓名班级 一、填空题(每空1分,共24分) 1. 大多数排序算法都有两个基本的操作:比较(两个关键字的大小)和移动(记录或改变指向记录的指 针)。 2. 在对一组记录(54,38,96,23,15,72,60,45,83)进行直接插入排序时,当把第7个记录60插入到有 序表时,为寻找插入位置至少需比较3次。(可约定为,从后向前比较) 3. 在插入和选择排序中,若初始数据基本正序,则选用插入排序(到尾部);若初始数据基本反序,则选 用选择排序。 4. 在堆排序和快速排序中,若初始记录接近正序或反序,则选用堆排序;若初始记录基本无序,则最好选 用快速排序。 5. 对于n个记录的集合进行冒泡排序,在最坏的情况下所需要的时间是O(n2) 。若对其进行快速排序,在 最坏的情况下所需要的时间是O(n2) 。 6. 对于n个记录的集合进行归并排序,所需要的平均时间是O(nlog2n) ,所需要的附加空间是O(n) 。 7.【计研题2000】对于n个记录的表进行2路归并排序,整个归并排序需进行log2n 趟(遍),共计移 动n log2n次记录。 (即移动到新表中的总次数!共log2n趟,每趟都要移动n个元素) 8.设要将序列(Q, H, C, Y, P, A, M, S, R, D, F, X)中的关键码按字母序的升序重新排列,则: 冒泡排序一趟扫描的结果是H, C, Q, P, A, M, S, R, D, F, X ,Y; 初始步长为4的希尔(shell)排序一趟的结果是P, A, C, S, Q, D, F, X , R, H,M, Y; 二路归并排序一趟扫描的结果是H, Q, C, Y,A, P, M, S, D, R, F, X ; 快速排序一趟扫描的结果是F, H, C, D, P, A, M, Q, R, S, Y,X; 堆排序初始建堆的结果是A, D, C, R, F, Q, M, S, Y,P, H, X。 9. 在堆排序、快速排序和归并排序中, 若只从存储空间考虑,则应首先选取堆排序方法,其次选取快速排序方法,最后选取归并排序方法; 若只从排序结果的稳定性考虑,则应选取归并排序方法; 若只从平均情况下最快考虑,则应选取快速排序方法; 若只从最坏情况下最快并且要节省内存考虑,则应选取堆排序方法。 二、单项选择题(每小题1分,共18分) (C)1.将5个不同的数据进行排序,至多需要比较次。

数据结构内排序实验报告

一、实验目的 1、了解内排序都是在内存中进行的。 2、为了提高数据的查找速度,需要对数据进行排序。 3、掌握内排序的方法。 二、实验内容 1、设计一个程序e xp10—1.cpp实现直接插入排序算法,并输出{9,8,7,6,5,4,3,2,1,0}的排序 过程。 (1)源程序如下所示: //文件名:exp10-1.cpp #include #define MAXE 20 //线性表中最多元素个数 typedef int KeyType; typedef char InfoType[10]; typedef struct //记录类型 { KeyType key; //关键字项 InfoType data; //其他数据项,类型为InfoType } RecType; void InsertSort(RecType R[],int n) //对R[0..n-1]按递增有序进行直接插入排序 { int i,j,k; RecType temp; for (i=1;i=0 && temp.key

查询与排序实验报告

_________ 学院_________ 专业____________ 班学号_______________ 姓名___________ 协作者______________ 师评定____________________ 实验题目查询与排序 综合实验评分表

实验报告 实验目的与要求 1、掌握散列表的构造及实现散列查找; 2、掌握堆排序的算法; 3、综合比较各类排序算法的性能。 二、实验内容 #include "stdio.h" #include "stdlib.h" #include "string.h" #include "windows.h" #define MAX 20 typedef struct{ unsigned long key; int result; char name[30]; }RNode; RNode t[MAX],r[MAX]; int h( unsigned long k) /* 散列函数*/ { return ((k - 3109005700)%11); } void insert(RNode t[],RNode x) /*插入函数,以线性探查方法解决冲突*/ { int i,j =0; i =h(x. key); while ((j 0)) j ++; if (j ==MAX) printf( "full\n"); i =(i +j) %/IAX; if (t[i] . key==0) {t[i] =x;} else { if (t[i] . key==x. key) printf( "记录已存在!\n"); } } int search(RNode t[], unsigned long k) /*插入函数,以线性探查方法解决冲突*/ {

相关主题
文本预览
相关文档 最新文档