文档库 最新最全的文档下载
当前位置:文档库 › 算法实验报告二分搜索算法

算法实验报告二分搜索算法

算法实验报告二分搜索算法
算法实验报告二分搜索算法

算法程序与设计预习实验报告

一、二分搜索算法:

代码:

#include

int BinarySearch(int a[], int x, int n){

int left = 0;

int right = x - 1;

while(left<= right){

int middle = (left + right)/2;

if(a[middle]

left = middle + 1;

else if(a[middle]>n)

right = middle - 1;

else

return middle;

}

return -1;

}

main(){

int i, serch, fanhui;

int a[10]={-24,-7,0,5,13,29,44,58,72,99};

for(i=0; i<10; i++)

printf("%d\t", a[i]);

printf("\n请输入要找的数:");

scanf("%d",&serch);

fanhui = BinarySearch(a,10,serch);

if(-1 == fanhui)

printf("查找失败\n");

else

printf ("查找成功\n");

}

运行结果:

二、合并排序:

代码:

#include

void Show(int c[], int n)

{

int i;

for ( i=0; i

printf("%d ", c[i]);

printf("\n");

}

void Merge(int d[], int l, int m, int r)

{

int e[10]={0};

for (int i=l,int j=m+1,int k=0;k<=r-l;k++)

{

if (i==m+1)

{

e[k]=d[j++];

continue;

}

if (j==r+1)

{

e[k]=d[i++];

continue;

}

if (d[i]

{

e[k]=d[i++];

}

else

{

e[k]=d[j++];

}

}

for (i=l,j=0;i<=r;i++,j++)

{

d[i]=e[j];

}

}

void MergeSort(int b[], int left, int right)

{

if (left

{

int i;

i=(left+right)/2;

MergeSort(b,left, i);

MergeSort(b,i+1,right);

Merge(b,left,i,right);

}

}

{ int a[10] = { 58,0,-24,99,29,5,13,44,72,-7};

Show( a, 10);

MergeSort( a, 0, 10-1 );

Show( a, 10);

return 0;

}

运行结果:

三、快速排序:

代码:

#include

#include

int Partition(int b[], int p, int r){

int key;

key=b[p];

while(p

while(p= key )

r--;

if(p

b[p++]=b[r];

while(p

p++;

if(p

b[r--]=b[p];

}

return p;

}

void QuickSort(int a[], int p, int r){

if (p

int q= Partition(a,p,r);

QuickSort(a,p,q-1);

QuickSort(a,q+1,r);

}

return;

}

main(){

int i;

int a[10]={58,0,-24,99,29,5,13,44,72,-7};

printf("快排前\n");

for(i=0;i<10;i++)

printf("%d\t",a[i]);

QuickSort(a,0,9);

printf("\n 快排后\n");

for(i=0; i<10; i++)

printf("%d\t", a[i]);

printf ("\n");

}

运行结果:

搜索策略实验报告

学生实验报告 实验课名称:人工智能 实验项目名称:八数码实验 专业名称:计算机科学与技术 班级: 2012240201 学号: 201224020102 学生姓名:张璐 教师姓名:陈亮亮 2014年12 月13 日

实验日期:2014 年12 月9 日实验室名称:明远2202

最后,为提高程序的运行效率,减少程序扩展节点时搜索量,将当前0所处位置(i_0:0在s[3][3]中所处行号,j_0:0在s[3][3]中所处列号)也存储在DATA中。 五.源程序: struct array { int id; int depth; int Wx; //错位个数 int moveNum;//计算移动距离 int a[MAX_X][MAX_Y]; int x; //0的横坐标(在数组里的) int y; //0的纵坐标 }; class EightDigital { public: EightDigital(int a[MAX_X][MAX_Y],int b[MAX_X][MAX_Y]); ~EightDigital(); bool safe(int x,int y); //判断与0相邻的位置能否交换,防止数组越界bool compare(); //判断是否到达目标 void search(int x,int y); //搜索目标 void addOpenTable(int x0,int y0,int x1,int y1);//x0,y0是交换前0的坐标,x1,y1是交换后0的坐标,加入open表 void addCloseTable(); //create close table void deleteOpenTable(); void insertSort(); void exchange(int x0,int y0,int x1,int y1); //交换数组值,移动0 int Wx(); //计算错位个数 void print(); //打印数组 bool haveSolution(); int moveNum();

查找与及其应用实验报告

{ printf("%d ",R[i].key); i++; //从表头往后找} if (i>=n) return -1; else { printf("%d",R[i].key); return i; } } int main() { SeqList R; int n=10,i; KeyType k=5; int a[]={3,6,2,10,1,8,5,7,4,9}; for (i=0;i

printf("%d ",R[i].key); printf("\n"); printf("查找%d所比较的关键字:\n\t",k); if ((i=SeqSearch(R,n,k))!=-1) printf("\n元素%d的位置是%d\n",k,i); else printf("\n元素%d不在表中\n",k); printf("\n"); } 代码片段2: #include #define MAXL 100//定义表中最多记录个数 typedef int KeyType; typedef char InfoType[10]; typedef struct { KeyType key;//KeyType为关键字的数据类型InfoType data;//其他数据 } NodeType; typedef NodeType SeqList[MAXL];//顺序表类型 int BinSearch(SeqList R,int n,KeyType k)//二分查找算法{

搜索引擎-第二次实验报告

实验二:实验 一、实验目的: 根据网络爬虫的基本原理,实现一个简易网络爬虫,需要达到以下指标: 1、种子URL为https://www.wendangku.net/doc/5812230981.html,; 2、至少抓取10000个页面; 3、至少完成3轮抓取,每轮给出更新的URL及其数量; 4、实现URL判重,列出每轮爬去时重复的URL数量; 5、数据存放到数据库中,能抽取出网页中的标题、页面生成日期(http协议中的时间),至少包含标题、时间、url、抓取时间、网页正文这几个字段。 二、实验方案: 1.爬虫分析与设计 我们组应用的是java来写爬虫,我们应用SSM框架将数据库和应用程序连接起来,可以在程序中更简单的进行数据库插入、查询等操作。 在对url处理的时候我们用的是Java的URL类,通过这个类可以获得请 求头的一些信息,例如编码方式。 如何获取url,我们一开始遇到了一些问题,直接解析网页中的ref 标签的时候得到的不全是网页链接,所以转换思路,我们先得到页面中 的标签,然后再得到标签里边href中的url,然后再对url进行处 理。 在处理url的时候,因为网页中的url并不是全部以http开头的,所以在url获取部分,对url的格式进行判断,如果通常格式就进行修改,例如,有的链接是”#”,我们就把开始搜索的url加到它的前边,形成一 个正确的url。

图1:应用URL类获取网页内容 图2:利用url请求头获取编码信息 图3:获取a标签

图4-1:获取url 图4-2:获取url

图5:url判重 2.数据库分析与设计 我们设计了两个表,一个是未爬取url表,两一个是已经爬取url表。 未爬取的表中村的是搜索判重之后,还没有爬取的url,已爬取的存储爬取到的信息。 图6:判重后需要爬取的url表 图7:爬取后url信息存储表

二分搜索实验报告

竭诚为您提供优质文档/双击可除 二分搜索实验报告 篇一:算法设计与分析二分查找实验报告 课程设计说明书 设计题目:二分查找程序的实现 专业:班级: 设计人: 山东科技大学年月日 课程设计任务书 学院:信息科学与工程学院专业:班级:姓名: 一、课程设计题目:二分查找程序的实现二、课程设计主要参考资料 (1)计算机算法设计与分析(第三版)王晓东著(2)三、课程设计应解决的主要问题 (1)二分查找程序的实现(2)(3)四、课程设计相关附件(如:图纸、软件等): (1)(2) 五、任务发出日期:20XX-11-21课程设计完成日期:

20XX-11-24 指导教师签字:系主任签字: 指导教师对课程设计的评语 成绩: 指导教师签字: 年月日 二分查找程序的实现 一、设计目的 算法设计与分析是计算机科学与技术专业的软件方向的必修课。同时,算法设计与分析既有较强的理论性,也有较强的实践性。算法设计与分析的实验过程需要完成课程学习过程各种算法的设计和实现,以达到提高教学效果,增强学生实践动手能力的目标。 用分治法,设计解决二分查找程序的实现问题的一个简捷的算法。通过解决二分查找程序的实现问题,初步学习分治策略。 二、设计要求 给定已按升序排好序的n个元素a[0:n-1],现要在这n 个元素中找出一特定元素x。实现二分搜索的递归程序并进行跟踪分析其执行过程。 用顺序搜索方法时,逐个比较a[0:n-1]中的元素,直至找出元素x,或搜索遍整个数组后确定x不在其中。这个方

法没有很好的利用n个元素已排好序这个条件,因此在最坏情况下,顺序搜索方法需要o(n)次比较。要求二分法的时间复杂度小于o(n)。 三、设计说明(一)、需求分析 二分搜索方法充分利用了元素间的次序关系,采用分治策略,可在最坏情况下用o(logn)时间完成搜索任务。 该算法的流程图如下: (二)、概要设计 二分查(:二分搜索实验报告)找的基本思路是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果 x=a[n/2],则找到x,算法终止;如果xa[n/2],则只要在数组a的右半部分继续搜索x。 由于二分查找的数组不一定是一个整数数组,所以我采用了c++中的模板函数,将排序函数sort和二分查找函数binarysort写为了模板函数,这样不尽可以查找整数数组,也可以查找小数数组。 由于查找的数组的长度不固定,所以我用了c语言中的malloc和realloc函数,首先定义一个数组指针,用malloc 函数该它分配空间,然后向数组中存数,当数组空间满时,在用realloc函数为数组再次分配空间。由于在随机输入一组数时不知在什么位置停止,所以 篇二:二分搜索实验报告

查找表实验报告

河北科技大学 实验报告 16级计算机科学与技术专业班学号 2019年5月21日姓名教师白云飞 实验名称查找表操作成绩 实验类型设计型实验批阅教师白云飞 一、实验目的 1.掌握查找表的基本概念。 2.掌握静态查找表(顺序查找、折半查找)的存储和算法实现。 3.掌握动态查找表(二叉排序树)的存储和算法实现。 二、实验内容 1.给出静态查找表的顺序存储结构描述。 2.实现顺序查找和折半查找操作。 3.给出二叉排序树的二叉链式存储结构描述。 4.实现二叉排序树的初始化、插入、删除、查找、清空等操作。 5.编写主程序实现对这些运算的测试。 三、实验环境 硬件:CPU I 5 内存4GB,硬盘512GB 操作系统:Windows XP 软件编程环境:VC++6.0 四、实验步骤 1.用VC建立一个控制台应用程序,命名为Search。 2.新建一个头文件,命名为datastru.h,包含标示符常量的定义和Status类型定义。 3.新建一个头文件,命名为Search.h,包含查找表的存储类型描述和基本运算的声明。4.新建一个程序文件,命名为Search.cpp,包含查找表基本运算的实现和复杂运算的实现。5.新建一个主程序文件,命名为SearchMain.cpp,包含对这些运算的测试。 五、程序源代码(对复杂的设计思想描述要有较详细的注释) 1.头文件datastru.h内容。 #define TRUE 1 #define FALSE 0 #define OK 1

#define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status ; 2.头文件Search.h内容。 …… 3.程序文件Search.cpp内容。 ……. 4.主程序文件SearchMain.cpp实现。 //设计测试程序 …… 六、实验数据、结果分析 (描述最终得到的结果,并进行分析说明) 既要有正确数据的测试也要有异常数据的测试。 七、结论体会 (说明实验过程中遇到的问题及解决办法;个人的收获;未解决的问题等)

实验一 二分搜索算法

实验一二分搜索算法 E08620311-方凯-08计算机(3)班 一.实验目的: 1、理解分治算法的概念和基本要素; 2、理解递归的概念; 3、掌握设计有效算法的分治策略; 4、通过二分搜索技术学习分治策略设计技巧; 二.实验内容及要求: 1.使用二分搜索算法查找任意N个有序数列中的指定元素。 2.通过上机实验进行算法实现。 3.保存和打印出程序的运行结果,并结合程序进行分析,上交实验报告。 4.至少使用两种方法进行编程。 二.实验原理: 二分搜索算法也称为折半查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。 【基本思想】将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x 作比较,如果x=a[n/2]则找到x,算法终止。如果xa[n/2],则我们只要在数组a的右半部继续搜索x。 二分搜索法的应用极其广泛,而且它的思想易于理解。第一个二分搜索算法早在1946年就出现了,但是第一个完全正确的二分搜索算法直到1962年才出现。Bentley在他的著作《Writing Correct Programs》中写道,90%的计算机专家不能在2小时内写出完全正确的二分搜索算法。问题的关键在于准确地制定各次查找范围的边界以及终止条件的确定,正确地归纳奇偶数的各种情况,其实整理后可以发现它的具体算法是很直观的。 方法一:直接查找; 方法二:递归查找; 方法三:迭代查找;

四.程序代码: 方法1:直接查找 int BinarySearch(int a[],int x,int n){ int left=0;int right=n-1; while(left<=right){ int middle=(left+right)/2; if(x==a[middle])return middle; if(x>a[middle])left=middle+1; else right=middle-1; } return-1; } 方法2:递归查找 int BinarySearchDG(int a[],int x,int left,int right){ int middle=(left+right)/2; if(left<=right){ if(x==a[middle])return middle; if(x>a[middle])return BinarySearchDG(a,x,middle+1,right); else return BinarySearchDG(a,x,left,middle-1); } return-1; }

二分查找算法详解

二分查找算法详解 二分查找算法,是一种在有序数组中查找某一特定元素的搜索算法。 注意两点: (1)有序:查找之前元素必须是有序的,可以是数字值有序,也可以是字典序。为什么必须有序呢?如果部分有序或循环有序可以吗? (2)数组:所有逻辑相邻的元素在物理存储上也是相邻的,确保可以随机存取。 算法思想: 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。 这里我们可以看到: (1) 如果查找值和中间值不相等的时候,我们可以确保可以下次的搜索范围可以缩小一半,正是由于所有元素都是有序的这一先决条件 (2) 我们每次查找的范围都是理应包含查找值的区间,当搜索停止时,如果仍未查找到,那么此时的搜索位置就应该是查找值应该处于的位置,只是该值不在数组中而已算法实现及各种变形: 1. 非降序数组A, 查找任一个值==val的元素,若找到则返回下标位置,若未找到则返回-1 2. 非降序数组A, 查找第一个值==val的元素,若找到则返回下标位置,若未找到则返回-1 (类似:查找数组中元素最后一个小于val 值的位置) 3. 非降序数组A, 查找最后一个值==val的元素,若找到则返回下标位置,若未找到则返回-1 (类似:查找数组中元素第一个大于val 值的位置) 4. 非降序数组A, 查找任一值为val的元素,保证插入该元素后数组仍然有序,返回可以插入的任一位置 5. 非降序数组A, 查找任一值为val的元素,保证插入该元素后数组仍然有序,返回可以插入的第一个位置 6. 非降序数组A, 查找任一值为val的元素,保证插入该元素后数组仍然有序,返回可以插入的最后一个位置 7. 非降序数组A, 查找任一个值==val的元素,若找到则返回一组下标区间(该区间所有值==val),若未找到则返回-1 8. 非降序字符串数组A, 查找任一个值==val的元素,若找到则返回下标位置,若未找到则返回-1(类似:未找到时返回应该插入点) 9. 循环有序数组中查找== val 的元素,若找到则返回下标位置,若未找到则返回-1 1. 非降序数组A, 查找任一个值==val的元素,若找到则返回下标位置,若未找到则返回-1 1 int binary_search(int* a, int len, int val) 2 { 3 assert(a != NULL && len > 0); 4 int low = 0; 5 int high = len - 1;

实现二分搜索、合并排序、快速排序

1、实验题目实现二分搜索、合并排序、快速排序 2、实验要求用分治法和递归技术实现上述问题,掌握设计有效算法的分治 策略 3、实验内容(问题描述、算法设计、算法效率) 实现二分搜索 A.问题描述:给定已排好序的n个元素a[0:n-1],现要在这n个元素中找出 一给定元素x。 B.算法设计:在问题中,n个元素已经排好序,二分搜索算法的基本思想是 将n个元素分成个数大致相同的两半,取a[n/2]与x作比较,如果x=a[n/2],则找到x,算法终止;如果xa[n/2],则只要在数组a的右半部继续按上方法搜索,直到搜索x。 C.算法效率:每执行一次算法的while循环,待搜索数组的大小减少一半。 因此,在最坏情况下,while循环被执行了O[logn]次。循环体内运算需要O[1]时间,因此整个算法在最坏情况下的计算时间复杂性为O[longn]。 D.代码: template int BinarySeatch(Type a[],const Type& x,int n) { int left=0; int right = n-1; while(left<=right){ int middle = (left+right)/2; if(x = = a[middle])return middle;

if(x>a[middle])left=middle+1; else right = middle –1;} return –1;} 实现合并排序 A.问题描述:对n个元素进行排序。 B.算法设计:将待排序元素分成大小大致想通的两个子集合,分别对两个子集合进行排序,最终将排好序的子集合合并成所要求的排好序的集合。 C.算法效率:自然合并排序算法需要O(n)时间,算法MergeSort需要O(nlogn)时间。 D.代码: void mergesort(int a[],int n) {int *b=new int[n]; int s=1; while(s

企业网站搜索引擎友好性分析实验报告

企业网站搜索引擎友好性分析实验报告 1.实验目的 了解搜索引擎营销对网络营销信息传递的作用,通过对部分选定网站搜索引擎进行友好性分析,深入研究网站建设的专业性对搜索引擎营销的影响,对于发现的问题,提出相应的改进建议。 2.实验内容和步骤 (1)从备选网站中选定一个企业网站; (2)浏览该网站并确认该网站最相关的2-3个核心关键词(比如主要产品名称、所在行业等); (3)用每个关键词分别在搜索引擎google和百度进行检索,了解该网站在搜索结果中的表现,如排名、网页标题和摘要信息内容等,同时记录 同一关键词检索结果中与被选企业同行的其他竞争者的排名和摘要信息情况; (4)根据有关信息分析被调查网站的搜索引擎友好性。 本实验备选网站网址 https://www.wendangku.net/doc/5812230981.html, https://www.wendangku.net/doc/5812230981.html, https://www.wendangku.net/doc/5812230981.html, https://www.wendangku.net/doc/5812230981.html, https://www.wendangku.net/doc/5812230981.html, https://www.wendangku.net/doc/5812230981.html, https://www.wendangku.net/doc/5812230981.html, https://www.wendangku.net/doc/5812230981.html, https://www.wendangku.net/doc/5812230981.html, https://www.wendangku.net/doc/5812230981.html, 3.实验报告 本次实验所选的网站是娃哈哈集团的https://www.wendangku.net/doc/5812230981.html,,并以GOOGLE,百度两个搜索引擎进行搜索。 杭州娃哈哈集团有限公司为中国最大的食品饮料生产企业,全球第五大饮料生产企业,仅次于可口可乐、百事可乐、吉百利、柯特这4家跨国公司主要生产含乳饮料、瓶装水、碳酸饮料、茶饮料、果汁饮料、罐头食品、医药保健品、休闲食品等八大类60多个品种的产品,其中瓶装水、含乳饮料、八宝粥罐头多年来产销量一直位居全国第一。进入该公司网页首先出现醒目的“娃哈哈”三个字,背景是传统的鮮紅色,配以简单的关键词和动态的产品图片介紹。通过浏览其网站后我觉得应该选用“饮料业”“饮用水”“乳品”作用核心关键词进行研究分析。 一,在GOOGLE搜索。

查找与排序实验报告

实验四:查找与排序 【实验目的】 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;

各种查找算法的性能比较测试(顺序查找、二分查找)

算法设计与分析各种查找算法的性能测试

目录 摘要 (3) 第一章:简介(Introduction) (4) 1.1 算法背景 (4) 第二章:算法定义(Algorithm Specification) (4) 2.1 数据结构 (4) 2.2顺序查找法的伪代码 (5) 2.3 二分查找(递归)法的伪代码 (5) 2.4 二分查找(非递归)法的伪代码 (6) 第三章:测试结果(Testing Results) (8) 3.1 测试案例表 (8) 3.2 散点图 (9) 第四章:分析和讨论 (11) 4.1 顺序查找 (11) 4.1.1 基本原理 (11) 4.2.2 时间复杂度分析 (11) 4.2.3优缺点 (11) 4.2.4该进的方法 (12) 4.2 二分查找(递归与非递归) (12) 4.2.1 基本原理 (12) 4.2.2 时间复杂度分析 (13) 4.2.3优缺点 (13) 4.2.4 改进的方法 (13) 附录:源代码(基于C语言的) (15) 声明 ................................................................................................................ 错误!未定义书签。

摘要 在计算机许多应用领域中,查找操作都是十分重要的研究技术。查找效率的好坏直接影响应用软件的性能,而查找算法又分静态查找和动态查找。 我们设置待查找表的元素为整数,用不同的测试数据做测试比较,长度取固定的三种,对象由随机数生成,无需人工干预来选择或者输入数据。比较的指标为关键字的查找次数。经过比较可以看到,当规模不断增加时,各种算法之间的差别是很大的。这三种查找方法中,顺序查找是一次从序列开始从头到尾逐个检查,是最简单的查找方法,但比较次数最多,虽说二分查找的效率比顺序查找高,但二分查找只适用于有序表,且限于顺序存储结构。 关键字:顺序查找、二分查找(递归与非递归)

二分搜索实验报告

二分搜索 一.实验目的: 1.理解算法设计的基本步骤及各步的主要内容、基本要求; 2.加深对分治设计方法基本思想的理解,并利用其解决现实生活中的问题; 3.通过本次实验初步掌握将算法转化为计算机上机程序的方法。 二.实验内容: 1.编写实现算法:给定n个元素,在这n个元素中找到值为key的元素。 2.将输入的数据存储到指定的文本文件中,而输出数据存放到另一个文本文件中,包括结果和具体的运行时间。 3.对实验结果进行分析。 三.实验操作: 1.二分搜索的思想: 首先,假设表中的元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复上述过程,知道找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。 由于二分搜索是基于有序序列的一种搜索算法,故将输入的一组数据首先进行排序,考虑到输入数据可能有多个,采用快速排或者是合并排序,其中与冒泡做了对比。 冒泡排序算法: void sort(int List[],int length){ int change; for(int i=0;iList[j]){ change=List[i]; List[i]=List[j]; List[j]=change; } } } 快速排序算法: void Qsort(int List[],int low,int high){ if(low>=high) return; int first=low; int last=high; int key=List[first]; while(first=key) --last; List[first]=List[last]; while(first

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

实验四——查找 一、实验目的 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<

实验十二 实现顺序和二分查找算法[管理资料]

实验十二实现顺序和二分查找算法[管理资料] 实验十二实现顺序和二分查找算法姓名:张就班级:09计算机一班学 号:2009111111 一、实验目的 掌握顺序和二分查找算法的基本思想及其实现方法。 二、实验内容 对给定的任意数组(设其长度为n),分别用顺序和二分查找方法在此数组中查找与给定值k相等的元素。三、算法思想与算法描述 1、顺序查找,在顺序表R[0..n-1]中查找关键字为k的记录,成功时返回找到的记录位置,失败时返回-1,具体的算法如下所示: int SeqSearch(SeqList R,int n,KeyType k) { int i=0; while(i=n) return -1; else { printf("%d",R[i].key);

return i; } } 2、二分查找,在有序表R[0..n-1]中进行二分查找,成功时返回记录 的位置,失败时返回-1,具体的算法如下: int BinSearch(SeqList R,int n,KeyType k) { int low=0,high=n-1,mid,count=0; while(low<=high) { mid=(low+high)/2; printf("第%d次查找:在[ %d ,%d]中找到元素R[%d]:%d\n ",++count,low,high,mid,R[mid].key); if(R[mid].key==k) return mid; if(R[mid].key>k) high=mid-1; else low=mid+1; } return -1; } 四、实验步骤与算法实现 #include #define MAXL 100

【二分查找法】

【二分查找法】 二分查找又称折半查找,它是一种效率较高的查找方法。 【二分查找要求】:1.必须采用顺序存储结构 2.必须按关键字大小有序排列。 【优缺点】折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除比较困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。 【算法思想】首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字, 则进一步查找前一子表,否则进一步查找后一子表。 重复以上过程,直到找到满足条件的记录,此时查找成功,或直到子表不存在为止,此时查找不成功。 C语言代码 int halfSearch(SeqList * R,int n , KeyType K ){ //在有序表R[0..n-1]中进行二分查找,成功时返回结点的位置,失败时返回-1 int low=0,high=n-1,mid;//置当前查找区间上、下界的初值 if(R[low].key==K) { return 0 ; } while(low<=high){ //当前查找区间R[low..high]非空 mid=low+((high-low)/2);//使用(low + high) / 2 会有整数溢出的问题

if(R[mid].key==K) { return mid;//查找成功返回 } if(R[mid].key>K) high=mid-1; //继续在R[low..mid-1]中查找 else low=mid+1;//继续在R[mid+1..high]中查找 } return -1;//当low>high时表示查找区间为空,查找失败 } Java代码: /** * 二分查找算法 * * @param srcArray 有序数组 * @param target 被查找的元素 * @return 找到元素target的数组下标,如果没有找到则返回-1 */ public class Search { public static int halfSearch(int[] srcArray, int target) { int low = 0; int high = srcArray.length-1;

二分搜索实验报告

南京邮电大学通达学院 实验报告 实验名称:二分查找原理 课程名称:微型计算机原理与接口技术 姓名班级学号:钱煜中 142501 14250120 实验时间:2016.11.25

二分查找原理 一、实验原理: 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。 首先,假设表a中n个元素是按升序排列,将表中间位置记录的关键字与查找关键字x比较,如果x=a[n/2]两者相等,则x查找成功,算法终止;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字xa[n/2],查找后一子表。重复以上过程,直到找到满足条件的记录x,使查找成功,或直到子表不存在为止,此时查找不成功。 值得注意的是,如果查找值x是有序序列a中的重复元素,二分查找不确定找到的是重复元素中的哪一个,例如,对于序列{1,2,3, 3,4},如果查找值为3,那么最终查找记录位置为3号元素或者4号元素都是正确结果;另一方面,如果找不到与查找值x完全相等的数值,将以序列a中与x最为相近的值作为最终查找结果。 举例。有序序列a = {1,2,3,4,5,7,9},查找数据x = 5,步骤如下: 序列a共有7个元素,因此查找数据5,

第一次比较,time = 1,index_mid = 4,mid = 4,x > mid,所以在后半部分中查找{4,5,7,9}; 第二次比较,time = 2,index_mid = 6,mid = 7,x < mid,因此在前半部分中查找{4,5,7}; 第三次比较,time = 3,index_mid = 5,mid = 5,x = mid,查找成功。 最终结果,查找次数time = 3,对应数值序号index = 5。 二、实验代码 #include #include void shuchu(int *a,int c) { int i; for(i=0;i

查找排序实验报告

《编程实训》 实验报告书 专业:计算机科学与技术 班级: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; //表的长度

二分搜索算法实验报告

实验一二分搜索算法实验报告 一.实验目的 1、理解分治算法的概念和基本要素; 2、理解递归的概念; 3、掌握设计有效算法的分治策略; 4、通过二分搜索技术学习分治策略设计技巧; 二.实验内容及要求 1.使用二分搜索算法查找任意N个有序数列中的指定元素。 2.通过上机实验进行算法实现。 3.保存和打印出程序的运行结果,并结合程序进行分析,上交实验报告。 4. 至少使用两种方法进行编程。 三.实验原理 二分搜索算法也称为折半查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。 【基本思想】将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如果xa[n/2],则我们只要在数组a的右半部继续搜索x。 二分搜索法的应用极其广泛,而且它的思想易于理解。第一个二分搜索算法早在1946 年就出现了,但是第一个完全正确的二分搜索算法直到1962年才出现。Bentley在他的着作《Writing Correct Programs》中写道,90%的计算机专家不能在2小时内写出完全正确的二

分搜索算法。问题的关键在于准确地制定各次查找范围的边界以及终止条件的确定,正确地归纳奇偶数的各种情况,其实整理后可以发现它的具体算法是很直观的。 方法一:直接查找 穷举法遍历 方法二:递归查找 #include<> #define MAX 30 int BinarySearch(int a[],int &x,int left,int right) { if(left>right){ return -1; } else{ left=(left+right)/2; if(x==a[left]) return left; else { if(x>a[left]) BinarySearch(a,x,left+1,right); else BinarySearch(a,x,left*2-right,left+1); } } } main() { int a[MAX]; int found,x,n,i,j,p; printf("输的个数\n"); scanf("%d",&n); printf("数组数据\n"); for(i=0;i

算法实验报告二分搜索算法

算法程序与设计预习实验报告 一、二分搜索算法: 代码: #include int BinarySearch(int a[], int x, int n){ int left = 0; int right = x - 1; while(left<= right){ int middle = (left + right)/2; if(a[middle]n) right = middle - 1; else return middle; } return -1; } main(){ int i, serch, fanhui; int a[10]={-24,-7,0,5,13,29,44,58,72,99}; for(i=0; i<10; i++) printf("%d\t", a[i]); printf("\n请输入要找的数:"); scanf("%d",&serch); fanhui = BinarySearch(a,10,serch); if(-1 == fanhui) printf("查找失败\n"); else printf ("查找成功\n"); } 运行结果:

二、合并排序: 代码: #include void Show(int c[], int n) { int i; for ( i=0; i

} void Merge(int d[], int l, int m, int r) { int e[10]={0}; for (int i=l,int j=m+1,int k=0;k<=r-l;k++) { if (i==m+1) { e[k]=d[j++]; continue; } if (j==r+1) { e[k]=d[i++]; continue; } if (d[i]

相关文档
相关文档 最新文档