各种查找算法的性能分析

合集下载

数据结构 查找 实验报告

数据结构 查找 实验报告

数据结构查找实验报告数据结构查找实验报告1·实验目的本实验旨在研究不同的查找算法在不同数据结构下的性能表现,通过实验结果对比分析,选取最优算法来完成查找操作。

2·实验方法2·1 数据结构选择在本实验中,我们选择了常用的数据结构进行查找性能比较,包括线性表、二叉树、哈希表等。

2·2 查找算法选择我们选择了以下常用的查找算法进行实验:●顺序查找●二分查找●插值查找●二叉查找树●平衡二叉查找树(AVL树)●哈希查找3·实验过程3·1 实验环境设置首先,我们需要搭建合适的实验环境,包括编程语言选择、编译器、开发环境等。

在本次实验中,我们选择了C++编程语言,并使用了Visual Studio 2019作为开发环境。

3·2 实验步骤为了比较各个查找算法的性能,我们按照以下步骤进行实验: 1·创建用于查找的数据结构,并初始化数据集合。

2·调用每个查找算法进行查找,并记录查找耗时。

3·分析实验结果,比较各个查找算法的性能。

4·实验结果与分析根据实验步骤中记录的各个查找算法的耗时,我们得到了以下结果:●对于小规模数据集,顺序查找表现较好。

●对于有序数据集,二分查找和插值查找表现最佳。

●对于动态数据集,哈希表的查找效率最高。

5·结论根据实验结果与分析,我们得出以下结论:●不同的数据结构适用于不同的查找需求。

●在静态有序数据集中,二分查找和插值查找是较好的选择。

●在动态数据集中,哈希表具有较高的查找效率。

附件:附件1:实验数据集附件2:查找算法代码法律名词及注释:1·数据结构:数据之间的组织方式和关系,使得我们可以高效地进行数据的存储和操作。

2·查找算法:在给定某个目标值的情况下,在给定数据集内寻找目标值的算法。

3·顺序查找:逐个比较目标值和数据集内的元素,直到找到目标值或者遍历完整个数据集。

常用查找算法的分类与特点

常用查找算法的分类与特点

常用查找算法的分类与特点在计算机科学中,查找算法是一种用于在数据集合中查找特定元素的方法。

查找算法的效率和性能对于许多应用程序来说至关重要,因为它们直接影响到程序的运行速度和资源使用情况。

本文将介绍一些常见的查找算法,并分析它们的特点和适用场景。

一、顺序查找顺序查找是最简单的查找算法之一。

它的基本思想是从数据集合的开头开始,逐个元素进行比较,直到找到目标元素或者遍历完整个数据集合。

顺序查找的优点是实现简单,对于小型数据集合或者无序数据集合来说,是一种可行的选择。

它不需要对数据进行预处理,也不需要额外的存储空间来保存索引或其他辅助信息。

然而,顺序查找的缺点也很明显。

它的平均查找时间复杂度为O(n),其中 n 是数据集合的大小。

这意味着当数据集合规模较大时,查找效率会非常低。

例如,如果我们要在一个包含 10000 个元素的数组中查找一个特定元素,最坏情况下可能需要比较 10000 次才能找到目标元素。

二、二分查找二分查找是一种在有序数据集合中进行查找的高效算法。

它的基本思想是通过不断将数据集合分成两半,比较目标元素与中间元素的大小,然后确定目标元素可能存在的子集合,重复这个过程直到找到目标元素或者确定目标元素不存在。

二分查找的优点是查找效率高,时间复杂度为 O(log n)。

这使得它在处理大规模有序数据集合时表现出色。

但是,二分查找要求数据集合必须是有序的。

如果数据集合是无序的,需要先进行排序,这会增加额外的时间和空间开销。

此外,二分查找在处理动态数据集合(即经常需要插入和删除元素的数据集合)时不太方便,因为每次插入或删除元素都可能破坏数据的有序性,需要重新进行排序。

三、哈希查找哈希查找是一种通过哈希函数将元素映射到哈希表中的特定位置来实现快速查找的算法。

哈希函数的设计至关重要,一个好的哈希函数能够将元素均匀地分布在哈希表中,减少冲突的发生。

当发生冲突时,通常采用链地址法或开放地址法等解决冲突的策略。

数据结构_查找原理及典型的查找算法

数据结构_查找原理及典型的查找算法
无法实现!因全部元素的定位只能从头指针head开 始,是一种非随机存取结构。
3.对非线性(树)结构如何进行折半查找? 可借助二叉排序树来查找(属动态查找表形式)。
9.1.2 有序表的查找
折半查找过程可以描述为一棵二叉树
折半查找的判定树 如:(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)
总之:
二叉排序树既有类似于折半查找的特性,又采用了链 表存储,它是动态查找表的一种适宜表示。
一、二叉排序树
(3)构造过程: 例:输入序列{45,12,37,3,53,100,24}
45
12
53
3
37
100
24
一、二叉排序树
(2)非递归查找过程 BiTree SearchBST(BiTree T,KeyType key){
CH9 查找
查找的基本概念 9.1 静态查找表
9.1.1 顺序查找 9.1.2 有序表的查找 9.1.3 索引顺序表的查找
9.2 动态查找表
9.2.1 二叉排序树和平衡二叉树 9.2.2 B-和B+树
9.3 哈希表
查找的基本概念
1.查找表 2.查找
关键字 主关键字 次关键字
}
9.2.1 二叉排序树和平衡二叉树
一、二叉排序树 二、平衡二叉树
一、二叉排序树
1.定义、特点、构造过程
(1)定义 二叉排序树或者是一棵空树,或是具有下列性质的二叉树:
若左子树非空,则左子树上所有结点的值均小于它的 根结点的值。
若右子树非空,则右子树上所有结点的值均大于它的 根结点的值。
有序/无序表 有序表
顺序/链式存 储
顺序存储
分块查找 介于二者之间 表中元素逐段有序 顺序/链式存储

查找算法实验报告

查找算法实验报告

查找算法实验报告查找算法实验报告一、引言查找算法是计算机科学中的一个重要概念,它在数据处理和信息检索中起着关键作用。

本实验旨在探究几种常见的查找算法,并对它们的性能进行比较和分析。

二、顺序查找算法顺序查找算法是最简单直观的一种查找方法,它逐个比较待查找元素与数据集中的元素,直到找到匹配项或遍历完整个数据集。

该算法的时间复杂度为O(n),其中n为数据集的大小。

尽管顺序查找算法的效率较低,但在小规模数据集或无序数据集中仍然具有一定的应用价值。

三、二分查找算法二分查找算法是一种高效的查找算法,它要求数据集必须是有序的。

该算法通过将待查找元素与数据集的中间元素进行比较,从而将查找范围缩小一半。

如果中间元素与待查找元素相等,则查找成功;如果中间元素大于待查找元素,则在左半部分继续查找;如果中间元素小于待查找元素,则在右半部分继续查找。

通过不断缩小查找范围,二分查找算法的时间复杂度为O(log n),其中n为数据集的大小。

二分查找算法在大规模有序数据集中具有较高的查找效率。

四、哈希查找算法哈希查找算法是一种基于哈希表的查找方法,它通过将待查找元素映射到哈希表中的一个位置,从而快速定位到目标元素。

哈希查找算法的时间复杂度为O(1),即常数级别。

然而,哈希查找算法对哈希函数的选择和哈希冲突的处理有一定的要求。

如果哈希函数设计不合理或哈希冲突过多,可能会导致查找效率下降。

五、比较与分析在本实验中,我们对上述三种查找算法进行了性能比较和分析。

实验结果表明,在小规模数据集或无序数据集中,顺序查找算法的效率较高;而在大规模有序数据集中,二分查找算法的效率最高。

哈希查找算法虽然具有常数级别的时间复杂度,但在哈希函数和哈希冲突处理上需要额外的开销。

因此,在实际应用中,我们需要根据具体需求选择合适的查找算法。

六、实验总结通过本次实验,我们深入了解了查找算法的原理和应用。

顺序查找算法、二分查找算法和哈希查找算法各具特点,在不同场景下有不同的优劣势。

软件工程师常见算法分析

软件工程师常见算法分析

软件工程师常见算法分析一、概述在软件开发中,算法是程序员必备的核心能力之一。

算法是解决问题的方法和步骤,是一种数学思维方式的体现。

对于软件工程师而言,常见的算法分析是学习和掌握各种算法的性能特点,选择合适的算法来解决具体的问题。

本文将介绍一些常见的算法以及其分析。

二、冒泡排序算法冒泡排序是一种简单且常见的排序算法。

它通过不断比较相邻的两个元素,并根据规则交换位置,实现将较大(或较小)的元素逐渐“冒泡”到最终位置的目的。

冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1)。

三、插入排序算法插入排序是一种简单且高效的排序算法。

它将数组分为已排序和未排序两个部分,逐个将未排序的元素插入到已排序的部分中,使得整个数组有序。

插入排序的时间复杂度为O(n^2),空间复杂度为O(1)。

四、选择排序算法选择排序是一种简单但较低效的排序算法。

它通过不断选择最小(或最大)的元素,并放置到已排序部分的末尾,实现整个数组的排序。

选择排序的时间复杂度为O(n^2),空间复杂度为O(1)。

五、快速排序算法快速排序是一种高效的排序算法。

它采用分治思想,通过确定一个基准元素,将数组划分为两个子数组,并递归地对子数组进行排序,最终实现整个数组的排序。

快速排序的时间复杂度通常为O(nlogn),空间复杂度为O(logn)。

六、二分查找算法二分查找是一种常见的搜索算法。

它适用于有序数组,通过不断将待查找区间缩小为一半,最终找到目标元素的位置。

二分查找的时间复杂度为O(logn),空间复杂度为O(1)。

七、动态规划算法动态规划是一种常见且重要的算法思想。

它通过将大问题拆分为子问题,并存储子问题的解,避免重复计算,从而提高算法的效率。

常见的动态规划问题包括斐波那契数列、背包问题等。

八、贪心算法贪心算法是一种简单且常用的算法思想。

它通过每一步选择当前状态下的最优解,从而希望得到全局最优解。

贪心算法通常适用于当局部最优解能够导致全局最优解的情况。

常见查找算法的优缺点分析

常见查找算法的优缺点分析

常见查找算法的优缺点分析在计算机科学中,查找算法是一种用于在数据集合中查找特定元素的方法。

不同的查找算法在时间复杂度、空间复杂度和适用场景等方面存在差异。

下面我们就来详细分析几种常见查找算法的优缺点。

首先是顺序查找算法。

这是最简单也是最直观的一种查找方法。

它的基本思路是从数据集合的开头,依次比较每个元素,直到找到目标元素或者遍历完整个集合。

顺序查找的优点在于实现简单,理解容易,对于小型数据集或者无序数据集来说,是一种可行的选择。

而且,它不需要对数据进行预处理,如排序等操作。

然而,其缺点也很明显。

当数据量较大时,顺序查找的效率非常低,因为它的平均时间复杂度为 O(n),其中 n 是数据集合的元素个数。

这意味着,随着数据量的增加,查找所需的时间会线性增长。

接下来是二分查找算法。

这种算法要求数据集合是有序的。

它通过不断将数据集一分为二,比较目标元素与中间元素的大小,从而缩小查找范围,逐步逼近目标元素。

二分查找的优点十分突出。

它的时间复杂度为 O(log n),效率比顺序查找高得多。

在大型有序数据集上,能够显著减少查找时间。

但二分查找也有其局限性。

首先,它要求数据集必须是有序的,如果数据集经常变动,维护有序性的成本可能会很高。

其次,对于小型数据集,由于其实现相对复杂,可能不如顺序查找来得直接和高效。

然后是哈希查找算法。

哈希查找通过将关键码值映射到一个特定的地址,从而实现快速查找。

哈希查找的最大优点就是查找速度极快,平均时间复杂度接近O(1),无论数据集的大小如何。

只要哈希函数设计得好,能够有效地避免冲突,就可以在常数时间内完成查找。

不过,哈希查找也并非完美。

哈希函数的设计是一个关键问题,如果设计不当,可能会导致大量的冲突,从而影响查找效率。

而且,当数据量增加时,可能需要重新调整哈希表的大小,这会带来一定的额外开销。

再说说插值查找算法。

它是二分查找的一种改进,根据要查找的关键字与查找表中最大最小关键字的比较结果,来选择合适的中间值进行比较。

路由查找算法研究与分析

路由查找算法研究与分析

路由查找算法研究与分析摘要:随着互联网络链路速率的不断提高,路由查找已成为路由器报文转发的瓶颈。

本文首先介绍和分析了路由器中广泛使用的各种典型IP 路由算法方法,并提出一种基于多分枝trie树的改进路由查找算法。

该算法保留了多分支trie树访存次数少,查询速度快的特点,并具有占用存储空间少,更新开销小等特点,对IPv4和IPv6地址都可以适用。

关键词:因特网;路由查找;最长前缀匹配;trie树1引言当前,因特网的规模、链路速度、带宽、流量等都呈指数级增长,这对路由器中IP 路由查找算法对大容量路由表处理的适应性以及报文转发查表的能力提出了更高要求。

路由器是构成因特网的中间结点,其转发性能决定了因特网的整体性能。

路由器的发展面临三个难题:交换结构、缓冲调度、报文处理。

随着半导体技术和光交换技术的发展,分组交换可以在很高的速率下得到实现。

因此,IP路由查找是实现高速分组转发的关键,其优劣直接影响了当前和未来因特网网络的整体性能[1]。

本文首先对现有的典型IP 路由算法进行介绍,总结其优缺点,并基于此提出一种基于多分枝trie树的路由查找算法。

2常用的路由查找算法分析2.1 硬件算法目前使用最多的硬件实现方法是使用CAM (Content AddressableMemory)内容可寻址存储器[2],它是一种特殊的存储器件,用来实现路由表查找的一种硬件方法。

CAM的最大特点是能够在一个硬件时钟周期内完成关键字的精确匹配查找。

为了能够实现最长前缀匹配,一个CAM表存放一类定长的前缀集。

IPV4下需要32个CAM。

这种方法有一个明显的缺点,在对地址前缀长度具体分配没有准确的了解之前,为了能够保证存储N个前缀表项目,每个CAM都要有N 个表项的空间,因此,CAM存储空间的利用率大大降低了。

另一种基于硬件的改进CAM算法是基于TCAM(三值CAM)的算法[3]。

在进行搜索的时候,所有的TCAM 项都需要同时进行匹配,在有多个匹配项时,TCAM 规定在所有匹配的表项中选取地址最低的表项作为最后的结果。

查找的算法实验报告

查找的算法实验报告

一、实验目的1. 理解并掌握几种常见的查找算法(顺序查找、二分查找等)的原理和实现方法。

2. 分析不同查找算法的时间复杂度和空间复杂度。

3. 通过实际编程,验证不同查找算法的性能差异。

4. 提高算法设计和分析能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 数据结构:列表(List)三、实验内容本次实验主要涉及以下几种查找算法:1. 顺序查找(Linear Search)2. 二分查找(Binary Search)3. 哈希查找(Hash Search)四、实验步骤1. 顺序查找实现顺序查找算法,用于查找列表中是否存在特定元素。

```pythondef linear_search(arr, target):for i in range(len(arr)):if arr[i] == target:return ireturn -1```2. 二分查找实现二分查找算法,要求列表已排序。

```pythondef binary_search(arr, target):low = 0high = len(arr) - 1while low <= high:mid = (low + high) // 2if arr[mid] == target:return midelif arr[mid] < target:low = mid + 1else:high = mid - 1return -1```3. 哈希查找实现哈希查找算法,使用哈希表存储数据,提高查找效率。

```pythondef hash_search(arr, target):hash_table = {}for i, num in enumerate(arr):hash_table[num] = ireturn hash_table.get(target, -1)```五、实验结果与分析1. 顺序查找- 时间复杂度:O(n)- 空间复杂度:O(1)2. 二分查找- 时间复杂度:O(log n)- 空间复杂度:O(1)3. 哈希查找- 时间复杂度:O(1)- 空间复杂度:O(n)六、实验结论1. 顺序查找算法简单易实现,但效率较低,适用于数据量较小的场景。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

项目名称:各种查找算法的性能测试项目成员:组编号:完成时间:目录前言 (2)正文 (2)第一章简介 (2)1.1顺序查找问题描述 (2)1.2二分查找问题描述 (2)第二章算法定义 (2)2.1顺序查找算法定义 (2)2.2二分查找算法定义 (3)第三章测试结果(Testing Results) (5)3.1 实验结果表 (5)3.2 散点图记录 (5)第四章分析和讨论 (6)4.1顺序查找分析 (6)4.2二分查找分析 (6)附录:源代码(基于C语言的) (7)声明 (13)前言查找问题就是在给定的集合(或者是多重集,它允许多个元素具有相同的值)中找寻一个给定的值,我们称之为查找键。

对于查找问题来说,没有一种算法在任何情况下是都是最优的。

有些算法速度比其他算法快,但是需要较多的存储空间;有些算法速度非常快,但仅适用于有序数组。

查找问题没有稳定性的问题,但会发生其他的问题(动态查找表)。

在数据结构课程中,我们已经学过了几种查找算法,比较有代表性的有顺序查找(蛮力查找),二分查找(采用分治技术),哈希查找(理论上来讲是最好的查找方法)。

第一章:简介(Introduction)1.1顺序查找问题描述:顺序查找从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录;反之,若直至第一个记录,其关键字和给定值比较都不等,则表明表中没有所查记录,查找不成功。

1.2二分查找问题描述:(1)分析掌握折半查找算法思想,在此基础上,设计出递归算法和循环结构两种实现方法的折半查找函数。

(2)编写程序实现:在保存于数组a[i]有序数据元素中查找数据元素k是否存在。

数元素k要包含两种情况:一种是数据元素k包含在数组中;另一种是数据元素k不包含在数组中(3)数组中数据元素的有序化既可以初始赋值时实现,也可以设计一个排序函数实现。

(4)根据两种方法的实际运行时间,进行两种方法时间效率的分析对比。

第二章:算法定义(Algorithm Specification)2.1顺序查找从表的一端向另一端逐个进行记录的关键字和给定值(要查找的元素)的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查找记录;反之,若直至第一个记录,其关键字和给定值比较都不等,则表明表中没有所查记录,查找不成功。

顺序查找的算法如下:int SeqSearch1(int r[ ], int n, int k) //数组r[1] ~ r[n]存放查找集合,n是数组中元素的个数(即查找表的长度),k是要查找的元素{i=n;//从后往前把表中的元素与要查找的元素进行比较while (i>0 && r[i]!=k)//当i>0并且数组元素中的值不等于要查找元素时,i减一继续执行while循环{ i--;}return i;//i的值为0则没找到,为非0则i为要查找元素的位置}2.2二分查找二分查找又称折半查找,二分查找首先要求待查找的表是有序表,如果要查找的元素是表的中间的那个元素,则找到要查找的元素,查找成功;如果要查找的元素比中间的那个元素小则使用相同的策略只在左边的区间查找就可以;如果要查找的元素比中间的那个元素大,则使用相同的策略在右边的区间进行查找;每次将待查找的元素的所在区间缩小一半。

(1)二分查找算法的递归算法int binary_search_2(int a[],int n,int k)//递归的二分查找算法的伪代码:查找表放在数组a中,n是查找表中元素的个数,k是待查找的元素{int Low,Mid,High;Low=0,High=n-1;//选择查找的最大的范围Mid=(Low+High)/2;//quicksort(a,0,SIZE-1);if (Low>=High) return -1;//数字-1表示没有结果if (a[Mid]==k) return Mid; //找到要查找的元素else if (a[Mid]>k)return (binary_search_2(a,Mid-1,k));//需要在左边的更小的范围内查找else return (binary_search_2(a+Mid+1,High-Mid,k));//在右边的更大的范围内查找}(2)二分查找的非递归算法int binary_search_1(int a[],int n,int k) //非递归的二分查找算法的伪代码:查找表放在数组a中,n 是查找表中元素的个数,k是待查找的元素{int Low,High,i,mid;Low=0;High=n-1;while(Low<High){mid=(Low+High)/2;if(k==a[mid])return mid;//查找成功else if(k>a[mid])Low=mid+1;//在后半区间查找else High=mid-1;//在前半区间查找}return 0;//查找失败}第三章:测试结果(Testing Results )3.1实验结果表:查找算法随机数组元素个数(个)查找时间(seconds )顺序查找2 0.022000 4 0.047000 6 0.062000 8 0.082000 100.100000二分查找2 0.190000 4 0.390000 6 0.390000 8 0.060000 100.0600003.2散点图:注释:横轴为数组元素个数,纵轴为(查找时间/1000)。

第四章:分析和讨论4.1.实现顺序查找算法:(1)顺序查找算法思路很简单,就是一种遍历的思想,一个个查找目标元素,实现也很简单。

(2)对于有n个元素的表适用顺序查找。

比较次数:不成功:比较n次。

成功查找:最好的情况为1次,即第一个元素即为目标元素;最差的情况为n次;平均比较次数(n+1)/2次。

所以当表很大时,顺序查找的代价是很大的。

(3)顺序查找算法不会有重复的比较出现,即一旦找到即成功,但同时这种代价是当表中有重复的目标元素时(比如有多个目标元素)我们只能得到第一个元素的位置。

顺序查找算法时间复杂度为O(n)。

4.2实现二分查找算法:(1)二分查找法思路:递增排列的表,首先从中间元素开始查找,如果元素比目标元素小,则查找后半部分表,反之查找前半部分表,并重复这一过程。

这样每次查找中我们都把表的长度减半。

(2)二分查找在实现中有量Low和High,每次减半的过程体现在Low和High的改变上,在代码的实现上可以使用单纯的循环或者用函数递归的思想。

递归思想更容易理解,但编写之后我们发现函数是尾递归,尾递归通常可以用简单的循环实现,循环在操作来说没有了函数调用的过程,更节省时间和空间。

(3)编码中小小地方的改动可能对程序有很大的改观。

如上述两种二分查找非递归binary_search_1(不比较等于的情况)递归binary_search_2(添加等于情况)折半搜索,也称二分查找算法、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。

搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。

如果在某一步骤数组为空,则代表找不到。

这种搜索算法每一次比较都使搜索范围缩小一半。

时间复杂度:二分搜索每次把搜索区域砍掉一半,很明显时间复杂度为O(lgn)或O(n)。

(n代表集合中元素的个数)空间复杂度:虽以递归形式定义,但是尾递归,可改写为循环,所以空间复杂度为 O(n)=O(lgn)。

附录:源代码(基于C语言的)#include "stdio.h"#include "time.h"#include "stdlib.h"#define SIZE 1000//待排数的规模#define PRT_RT 1//是否显示排序前后的数组情况,对较大规模的数组不显示//0为不显示,1为显示//顺序查找算法int SeqSearch1(int r[ ], int n, int k) //数组r[1] ~ r[n]存放查找集合,n是数组中元素的个数(即查找表的长度),k是要查找的元素{int i=n;//从后往前把表中的元素与要查找的元素进行比较while(i>0 && r[i]!=k){i--;}return i;//i的值为0则没找到,为非0则i为要查找元素的位置}//二分查找的递归算法int binary_search_2(int a[],int n,int k)//递归的二分查找算法的伪代码:查找表放在数组a中,n是查找表中元素的个数,k是待查找的元素{int Low,Mid,High;Low=0,High=n-1;//选择查找的最大的范围Mid=(Low+High)/2;if (Low>=High) return -1;//数字-1表示没有结果if (a[Mid]==k) return Mid; //找到要查找的元素else if (a[Mid]>k)return (binary_search_2(a,Mid-1,k));//需要在左边的更小的范围内查找else return (binary_search_2(a+Mid+1,High-Mid,k));//在右边的更大的范围内查找}//二分查找的非递归算法int binary_search_1(int a[],int n,int k){int Low,High,i,mid;Low=0;High=n-1;while(Low<High){mid=(Low+High)/2;if(k==a[mid])return mid;//查找成功else if(k>a[mid])Low=mid+1;//在后半区间查找else High=mid-1;//在前半区间查找}return 0;//查找失败}//快速排序算法void quicksort(int c[],int start,int end) {int i,j,mid;i=start;j=end;mid=c[i];while(start>=end)return;while(i<j){while(i<j && c[j]>mid)j--;if(i<j){c[i]=c[j];i++;}while(i<j && c[i]<mid)i++;if(i<j){c[j]=c[i];j--;}}c[i]=mid;quicksort(c,start,i-1);//递归调用快速排序继续对前半部分的元素进行排序quicksort(c,i+1,end);// 递归调用快速排序继续对后半部分的元素进行排序}int main()//主函数{int i,j;long start,end;//声明时间变量double duration;//声明用来记录时间的变量int *a;a=(int*)malloc(sizeof(int)*SIZE);//分配SIZE字节的存储区srand((unsigned)time(NULL));for(i=0;i<SIZE;i++)//随机赋值{a[i]=rand()%SIZE;//取[0,SIZE)之间的随机整数if(PRT_RT == 0)printf("%d ",a[i]);//输出这个数组}printf("\n");printf("请输入顺序查找要查找的元素:\n");scanf("%d",&j);printf("输出该元素的下标:%d\n",SeqSearch1(a, SIZE, j));//以下统计顺序查找的运行时间start=clock();SeqSearch1(a,SIZE,j); //在这里插入你要计算时间的算法,这里计算的是冒泡排序算法当输入规模为SIZE的时候的算法的时间end = clock();duration=(double)(end-start)/CLOCKS_PER_SEC;printf("the SeqSearch1 time is:%f\n",duration);//输出时间//以下显示顺序查找排序结果if(PRT_RT == 0){quicksort(a,0,SIZE-1);for(i=0; i<SIZE; i++){printf("%d ", a[i]);}printf("\n");}system("pause");printf("请输入递归二分查找要查找的元素:\n");scanf("%d",&j);printf("输出该元素的下标:%d\n",binary_search_2(a,SIZE,j)); //以下统计递归二分查找的运行时间start = clock();binary_search_2(a, SIZE, i);end = clock();duration = (double)(end-start)/CLOCKS_PER_SEC;printf("the search time is :%f\n",duration);//输出时间system("pause");printf("请输入非递归二分查找要查找的元素:\n");scanf("%d",&j);printf("输出该元素的下标:%d\n",binary_search_1(a,SIZE,j)); //以下统计非递归二分查找的运行时间start = clock();binary_search_1(a,SIZE,j );end = clock();duration = (double)(end-start)/CLOCKS_PER_SEC;printf("the search time is :%f\n",duration);//输出时间system("pause");return 0;}声明我们在此声明,这个题为“各种查找算法性能分析”的项目的所有工作是由作为一组的我们的成员的各自的努力而完成的。

相关文档
最新文档