计算机软件计算基础 第六章 查找和排序
计算机软件技术基础 第6章 查找和排序

等概率情况下其平均查找长度为
ASL log 2 (n 1) 1
即 O(log2n)
动态查找技术
动态查找技术所依赖的查找表以树状结构居多,例如二 叉排序树、B+树、B-树等。 它们的共同特点是结构灵活, 易于实现插入、删除等操作。这里主要介绍简单易用的二 叉排序树
二叉排序树的定义
二叉排序树可能为一棵空的二叉树,若非空则必须满足 以下特征: (1)根结点左子树中所有结 点的关键字小于根结点的关 键字; (2)根结点右子树中所有结 点的关键字大于或等于根结 点的关键字; (3)根结点的左右子树也都 一棵二叉排序树 是二叉排序树。
二叉排序树动态查找算法C++语言描述如下:
BinNode* Search_ Insert (BinNodePtr &p, KeyType key) { BinNode *pre=NULL; // 循环查找过程 while(p!=NULL && p->x!=key ) { pre=p; // pre为结点p的父结点指针 if( key<p->x ) p=p->left; else p=p->right; } // 查找失败,插入新结点 ( 见下一页 )
排序基本概念Байду номын сангаас
排序是计算机内经常进行的一种操作,其目的是将一组同 类型的记录序列调整为按照元素关键字有序的记录序列。 例如将学生记录按学号排序,将课程记录按课程编码排序。 排序的形式化定义为:假设含n个记录的序列为{ R1,
R2,…,Rn },其相应的关键字序列为{ K1, K2,…, Kn }。现确定一种排列p1,…,pn,使其关键字满足递增 (或递减)关系Kp1≤Kp2≤…≤Kpn,使原序列成为一个 关键字有序的序列{ Rp1, Rp2, …,Rpn },此操作称作 排序。
【精品】计算机软件技术基础PPT课件 第4章 查找与排序技术

四、字符串匹配算法
字符串匹配: 从字符串中找到一个子字符串(从正文S中查找 模式p的位置)。
算法思路: ①、从正文S和模式p的第一个字符开始逐个比较; ②、若所有字符都匹配则找到子字符串,结束; ③、若有不匹配,则将模式p沿正文S向后移一个位
置,回到①执行。 上述过程直到正文比较完。
字符串的匹配算法描述
一、顺序查找
1、顺序查找 指在线性表中依次查找关键字的方法,一般
来说效率较低,但在以下两种情况下只能采取顺 序查找。
①、顺序存储的线性表为无序表; ②、有序表以链式存储结构存储。
最坏情况复杂度:W(n)=n
2、顺序存储结构下的顺序查找
PROCEDURE SERCH(V,n,x,k) k=1 WHILE (k≤n AND V(k)≠x) DO k=k+1 IF k=n+1 THEN k=0 RETURN k
当有序表长度为n时,W(n)=log2(n)+1。
3、对分查找的算法描述
在顺序存储的非递减有序表V(1:n)中,查找 x 出 现的位置k,若线性表中无 x,则令k=0。
PROCEDURE BSERCH(V,n,x,k) i=1 ; j=n WHILE i≤j DO
{ k=INT((i+j)/2) IF x=V(k) THEN RETURN k IF x<V(k) THEN j=k-1 ELSE i=k+1 }
3、分块有序表的查找
KEY(1:m) 22 46 86 K (1:m) 1 7 13
V(1:n) 22 12 13 8 9 20 33 42 44 38 24 46 60 58 74 47 86 53
算法思路: ①、对分查找索引表,确定待查项x可能所在 的子表。 ②、在相应的子表中顺序查找 x。
查找和排序的基本操作

实践教学*******************软件学院2012学年秋季学期上机实验报告册课程名称:_________________________实验名称:_________________________指导教师:_________________________小组成员: ******************** ******************** **********查找和排序一.实验目的1.熟悉并掌握二分查找算法;2.熟悉并掌握起泡排序算法;3.熟悉并掌握简单选择算法;4.熟悉并掌握直接插入排序算法;5.熟悉并掌握二分插入排序算法;6.熟悉并掌握快速排序算法;二.实验内容和原理1.二分查找算法二分查找算法的思路:初始状态:假设表长为n,low、high和mid分别指向待查元素所在区间的下界、上界和中点,key为给定值,初始时,令low=0,high=n-1,mid=(low+high)/2 让key与mid指向的记录比较若key==r[mid].key,查找成功,算法结束;若key<r[mid].key,则high=mid-1;若key>r[mid].key,则low=mid+1;重复上述操作,直至low>high时,查找失败。
2.起泡排序算法起泡排序的思路:首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序(即L.r[1].key>L.r[2].key),则将两个记录交换之,然后比较【第二个记录和第三个记录】的关键字。
以此类推,直至第n-1个记录和第n个记录的关键字进行过比较为止。
上述过程称做第一趟起泡排序,其结果使得关键字最大的记录被安置到最后一个记录的位置上,然后进行第二趟起泡排序,对前n-1个记录进行同样操作,其结果是使关键字次大的记录被安置到第n-1个记录的位置上。
一般地,第i躺起泡排序是从L.r[1]到L.r[n-i+1]以此比较相邻两个记录的关键字,并在“逆序”时交换相邻记录,其结果是这n-i+1个记录中关键字最大的记录被交换到第n-i+1的位置上。
软件技术基础_查找

其中,n:记录个数,Pi:查找第i个记录的查找概率,
Ci:成功找到第i个记录的比较次数。
若Pi=1/n(等概),则
1 n
ASL n i1 Ci
3
3.1 基本查找技术
3.1.1 线性查找(顺序查找)
1. 方法
从第一个记录开始,逐个比较记录值: 找到与k相等的记录,查找成功; 否则,查找失败。
if (x==A[mid]) return mid;
else if (x<A[mid])
hig=mid-1;
else
low=mid+1;
}
return(0);
}
9
3.1 基本查找技术
3.1.2 对分查找
4. 算法分析
等概率下的平均查找长度:
ASL PiCi等概 1 n Ci 1 n k2k1nn 1lo2g (n1)1
分析:第1, 2, 3位分布太不均匀,删去; 第8位只有2和7,删去。第4, 5, 6, 7位 分布近似随机,设存储空间为100,则 可取其中二位作为哈希地址:
81338967 81354157
65,22,74,13,28,89,41
16
3.2 哈希查找
3.2.1 哈希表技术及其查找
2)平方取中法:取关键字平方后的中间几位作为哈希地 址(一个数平方后的中间几位数和数的每一位都相 关)。
关键字: 0100, 1100, 1200, 1160, 2061, 2062 关键字2:0010000,1210000,1440000,1345600,4247721,4251844 哈希地址:010, 210, 440, 345, 247, 251
(存储空间设为1000)
C语言课件(查找和排序)

查找与排序
简单选择排序
简单选择排序
续
printf("\nTo sort...\n");
for (i=0;i<len-1;i++) { min=i; for (j=i+1;j<len;j++) if (list[min]>list[j]) min=j; tmp=list[i]; list[i]=list[min]; list[min]=tmp; }
printf("Finished! The list has been sorted:\n"); for (i=0;i<len;i++) printf("%-4d",list[i]);
}
查找与排序
冒泡排序
冒泡排序
将相邻两个数比较,把小的调到前面,大数放到后面。
78 45 32 10 29 80 92 8 61 55 45 78 32 10 29 80 92 8 61 55 45 32 78 10 29 80 92 8 61 55 45 32 10 78 29 80 92 8 61 55 45 32 10 29 78 80 92 8 61 55 45 32 10 29 78 80 92 8 61 55 45 32 10 29 78 80 92 8 61 55 45 32 10 29 78 80 8 92 61 55 45 32 10 29 78 80 8 61 92 55 45 32 10 29 78 80 8 61 55 92 32 10 29 45 78 8 61 55 80 92 10 29 32 45 8 61 55 78 80 92
软件技术基础——非线性结构 检索与排序

《软件技术基础》课程考试范围及要点第一章数据结构第三节非线性结构1、树结构的定义,识记2、树的相关术语:节点、度、深度、有序树、无序树、森林等,识记根结点:没有前驱,仅有后继茎)分支结点:有且仅有一个前驱,可以有多个后继叶结点:没有后继,仅有前驱结点的度:该结点拥有的子树数目树的度:最大的结点度深度:最大的层次数有序树:兄弟有长幼之分,从左至右。
交换兄弟位置,变成不同的树森林:不相交的树的集合3、二叉树的定义和结构声明,识记二叉树是结点的有限集,或为空,或由根的左、右子树组成,左右子树又分别是符合定义的二叉树。
4、二叉树的几种类型及特点,识记和简单应用满二叉树:所有的结点要么有两个孩子,要么一个也没有。
所有的叶结点都位于同一层。
半满二叉树:深度为K的二叉树,K-1层是满二叉树,K层节点个数不足2K-1个完全二叉树:特殊的半满二叉树,最后一层节点从左至右依次排列,没有间断。
5、二叉树的顺序存储结构,领会将完全二叉树从上到下,从左到右编号后,结点号码可作为数组的下标,从而将完全二叉树顺序存储下来。
当给出任意结点i,我们可以知道它的父结点为[ i/2 ],两个孩子分别为2i和2i+1。
一般的二叉树相对于同样深度的完全二叉树,缺失了部分结点,在顺序存储时,这些位置要空出来。
以维持结点编号之间的父子换算关系6、二叉树的连接存储结构,识记7、二叉树的遍历算法,领会和简单应用8、二叉排序树的创建,领会和简单应用8、树、森林和二叉树的转换,领会9、图的定义和相关术语,识记图是由非空的顶点组成的有限集和边的有限集组成有向图与无向图由有向边组成的图,称为有向图有向边以< X,Y >表示,又称为弧由无向边组成的图,称为无向图无向边以(X,Y)表示权与网图中边或弧所具有的相关数称为权一般用于表明从一个顶点到另一个顶点的距离或耗费带权的图称为网路径:图中沿着各条边,从X到Y所经历的顶点序列称为路径第一顶点与最后一个顶点相同的路径称为环回路:序列中不出现重复的路径称为简单路径有重复的路径称为回路连通:在图中若X与Y之间有路径,则称X,Y是连通的连通图:任意两个顶点都连通的图称为连通图连通分量:指无向图中极大连通子图,即有多少个连通子图10、利用邻接矩阵存储图,识记和简单应用11、利用邻接表存储图,识记和简单应用12、图的深度优先和广度优先遍历算法,领会(能根据图写出遍历顺序)●深度优先遍历(1)从一个未访问过的顶点开始,访问它的一个未访问过的相邻顶点。
计算机软件技术基础
数据集合中各元素之间所固有的逻辑关系称之为:数据的逻辑结构数据在计算计中的储存关系称之为:数据的储存结构所谓的数据处理是指对数据集合中的各元素以各种方式进行运算,包括插入、删除、查找、更改等运算,也包括对数据元素进行分析。
有序表、无序表顺序查找: 从第一个元素开始,逐个与被查找元素进行比较,直到某元素与被查找元素相等,或者表中所有元素与被查元素进行比较后都不相等。
数据结构:指相互有关联的数据元素的集合。
数据元素具有广泛的含义,一般来说,现实世界中客观存在的一切个体都可以看做是数据元素。
逻辑关系:在数据处理领域中,通常把数据元素之间这种固有的关系简单的用前件后件关系来描述。
前后件关系是数据元素之间的一个基本关系,但前后件关系所表示的实际意义随具体对象的不同而不同。
一个数据结构应包含以下两方面的信息:表示数据元素的信息。
表示各数据元素之间的前后件关系。
数据的逻辑结构是:反映数据元素之间逻辑关系的数据结构。
一个数据的逻辑结构根据需要可以表示成多种储存结构,常用的储存结构有顺序储存结构连接储存结构索引储存结构在数据结构中,没有前件的结点称为根结点,没有后件的结点称为终端结点(也称为叶子结点)。
除了根结点和终端结点外的其他结点一般称之为内部结点。
数据结构根据前件后件的关系分为:线性结构和非线性结构非空的线性数据结构即:线性表有以下2大特点:有且只有一个根结点。
每一个结点最多有一个前件,也最多有一个后件。
如果一个数据结构不是线性结构,则称为非线性结构在复杂的线性表中,一个数据元素还可以由若干个数据项组成。
由若干个数据项组成的数据元素称为:记录,而由多个记录构成的线性表又称为:文件。
非空线性表有如下一些结构特征:有且只有一个根结点,它无前件。
有且之有一个终端结点,它无后件。
出根结点与终端结点外,其他所有结点有且只有一个前件,有且只有一个后件。
线性表中结点的个数n称为线性表的长度。
当n=0时,称为空表。
线性表的顺序储存结构具有以下两个基本特点:(1)线性表中所有元素所占用的存储空间是连续的。
程序设计培训讲义5:排序与查找
其余方法详见: 程序设计培训讲义7:数组
#include <stdio.h> #define N 100 int a[N]={-2,11,-4,13,-5,-2}; int max3(int x,int y,int z) { int m;
m=x>y ? x:y; return m>z ? m :z; } void main() { int maxsub(int a[],int left,int right); printf("Maxsub=%d\n",maxsub(a,0,3)); }
第二趟排序是在无序的{R2, R3, ..., Rn}中选出 最小的元素,将它与R2交换。
第i趟排序时{R1, R2, R3, ..., Ri-1}已排好序, 在当前无序的{Ri, ..., Rn}中再选出最小的元素,将 它与Ri元素交换,使{R1, R2, R3, ..., Ri}成为有序
……………
二趟排 序结果
13 04 49 38 27 49 55 65 97 76 13 04 49 38 27 49 55 65 97 76
取步长 为1即 对整个 数据进 行插入 排序
三趟排 序结果
[04 13] 49 38 27 49 55 65 97 76 [04 13 49] 38 27 49 55 65 97 76 [04 13 38 49] 27 49 55 65 97 76 [04 13 27 38 49] 49 55 65 97 76
else printf("%d\n",t); }
二、折半(二分)查找
基本思想:
如果查找表中的数据元素按关键字有序(假 设递增有序),则在查找时,可不必逐个顺序比 较,而采用跳跃的方式——先与“中间位置”的 数据元素关键字比较,若相等,则查找成功;若 给定值大于“中间位置”的关键字,则在查找表 的后半部继续进行二分查找,否则在前半部进行 二分查找。
数据结构与算法(C语言篇)第六章 查找与排序
目录
CATALOUGUE
01 查找 排序
初心至善 匠心育人
6.1 查找
6.1.1 顺序查找
顺序查找(Sequential Search)又可以称为线性查找,是最基本的查找技 术。顺序查找的基本原理是从数 据集合中的第一个(或最后一个)数据元素 开始,逐个与给定值进行对比。如果某个数据元素与给定值 相同,则查找成功。如果查找到最后一个(或第一个)数据元素,都与给定值不同,则查找失败。 代码如书例 6-1 所示
初心至善 匠心育人
6.1 查找
6.1.4 哈希查找
2.哈希冲突 由于通过哈希函数产生的哈希地址是有限的,而在数据比较多的情况下,经过哈希函数处理后, 不 同的数据可能会产生相同的哈希地址,这就造成了哈希冲突,如图 6.8 所示。 除了构造哈希函数外,哈希算法的另一个关键问题就是解决哈希冲突,其方法有很多,具体如 下。 (1)开放地址法。开放地址法有 3 种探测方式:线性探测、再平方探测、伪随机探测。线性探 测指的 是按顺序决定哈希地址时,如果某数据的哈希地址已经存在,则在原来哈希地址的基础上向 后加一 个单位,直至不发生哈希冲突。再平方探测指的是按顺序决定哈希地址时,如果某数据的哈 希地址 已经存在,则在原来哈希地址的基础上先加 1 的平方个单位,若仍然存在则减 1 的平方个单 位,之 后是 2 的平方,以此类推,直至不发生哈希冲突。伪随机探测指的是按顺序决定哈希地址时, 如果 某数据的哈希地址已经存在,则通过随机函数随机生成一个数,在原来哈希地址的基础上加上 随机 数,直至不发生哈希冲突。 (2)建立公共溢出区。建立公共溢出区存储所有造成哈希冲突的数据。 (3)再哈希法。对冲突的哈希地址再次进行哈希处理,直至没有哈希冲突。 (4)链地址法。对相同的哈希地址使用链表进行连接,使用数组存储每一个链表。
软件技术基础Chap03-查找与排序技术(6p)
分块查找示意图
例子
28 59 87
9
17 12 23 28 29 37 59 43 63 87 76 83
分块查找效率(ASLbs)为 lo g 2 ( n / s 1) s / 2 当 s n 时,ASLbs取最小值 n 1。
Hash表技术
基本思想 将记录的关键字与它的存储位置之间建立一 个确定的关系H,使每个关键字和一个确定 的存储位置相对应,从而在查找时,只需要 根据对应关系计算出给定的关键字值k对应 的值H(k),就可以快速确定记录的存储位置。 Hash函数 将记录的关键字值与记录的存储位置对应起 来的关系H称为Hash函数,H(k)的结果称 为Hash地址。
依次将记录序列中的每一个记录插入到有序段中,使有序段的 长度不断地扩大。 首先将待排序记录序列中的第一个记录作为一个有序段,将记 录序列中的第二个记录插入到上述有序段中形成由两个记录组 成的有序段,再将记录序列中的第三个记录插入到这个有序段 中,形成由三个记录组成的有序段。依此类推,每一趟都是将 一个记录插入到前面的有序段中。 算法简单易懂; 空间复杂度低; 稳定排序方法;
平方取中法
取关键字平方后的中间几位为Hash地址。由于平方后的中 间几位数与原关键字的每一位数字都相关,只要原关键字的 分布是随机的,以平方后的中间几位数作为哈希地址一定也 是随机分布。
根据探测序列进行分类
折叠法
把关键字折叠成位数相同的几部分,然后取这几部分的叠加 作为Hash地址。在关键字位数较多,且每一位上数字的分 布基本均匀时,采用折叠法,得到的Hash地址比较均匀。
10
N
随机探测 链地址
1
ln(1 )
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ASL = ∑ p c
i =1 i
n
i
其中: :问题规模,查找集合中的记录个数; 其中:n:问题规模,查找集合中的记录个数; pi:查找第 个记录的概率; 查找第i个记录的概率 个记录的概率; ci :查找第 个记录所需的关键字的比较次数 查找第i个记录所需的关键字的比较次数
二,线性表的查找
3,哈希函数的构造方法
构造哈希函数的一般原则是,哈希函数的运算尽 构造哈希函数的一般原则是, 可能地简单,哈希函数的值在表长范围内, 可能地简单,哈希函数的值在表长范围内,并且 尽可能使不同的关键字值不同的哈希函数值( 尽可能使不同的关键字值不同的哈希函数值(即 尽可能地减少地址冲突). 尽可能地减少地址冲突). 常见的哈希函数够造方法有如下七种: 常见的哈希函数够造方法有如下七种: 直接地址法 数字分析法 平方取中法 折叠法 除留余数法 乘余取整法 随机数法
下图是将一个长度n = 19的线性表分成 19的线性表分成 m = 3个子表的分块有序表示意图. 3个子表的分块有序表示意图. 个子表的分块有序表示意图
分块查找又称索引顺序查找,用于在分块 分块查找又称索引顺序查找, 有序表中进行查找. 有序表中进行查找. 分块查找的过程可以分两步进行: 分块查找的过程可以分两步进行: (1)查找索引表,以便确定被查元素所在 查找索引表, 子表的位置. 子表的位置. (2)在相应的子表中用顺序查找法进行具 体的查找. 体的查找.
1,动态查找和静态查找 查找的同时对表做修改(如插入或删除)的表 查找的同时对表做修改(如插入或删除) 称之为动态查找表,否则为静态查找表. 称之为动态查找表,否则为静态查找表. 2,平均查找长度 衡量一个查找算法优劣的标准是在查找过程中 对关键字需要执行的平均比较次数( 对关键字需要执行的平均比较次数(即平均查找 ASL = ∑ 长度ASL)将查找算法进行的关键字的比较次数的 pc 长度ASL ASL) 数字期望值定义为平均查找长度,计算公式为: 数字期望值定义为平均查找长度,计算公式为:
在下面两种情况下只能采取顺序查找 a. 线性表为无序表(元素排列是无序的); 线性表为无序表(元素排列是无序的); b. 即使是有序线性表,但采用的是链式存 即使是有序线性表, 储结构
2,二分查找(折半查找) 二分查找(折半查找) 要求线性表结点按关键字码值排好,且以顺序 要求线性表结点按关键字码值排好, 方式存储 前提:必须在具有顺序存储结构的有序表中进 前提: 行 方法:用要查找的码值X与中间位置结点的关键 方法:用要查找的码值X 码值W相比较: 码值W相比较: (1)X=W,此时已经查找成功,查找结束 (1)X=W,此时已经查找成功, (2)X>W,表明X在表的后半部分,取后半部 (2)X>W,表明X在表的后半部分, 分进行查找 (3)X<W,表明X在表的前半部分,取前半部 (3)X<W,表明X在表的前半部分, 分进行查找
(2)数字分析法
根据关键字在各个位上的分布情况,选取分布比较均匀的若干 根据关键字在各个位上的分布情况, 位组成哈希地址. 位组成哈希地址. 如学生的学号: 如学生的学号:001080312001
(3)平方取中法
平方取中法是对关键字平方后,按散列表大小,取中间的若干 平方取中法是对关键字平方后,按散列表大小, 位作为散列地址(平方后截取) 位作为散列地址(平方后截取)
信息技术学院 王静
–6.1 查找 –6.2排序
在数据处理领域中,最常见的运算是在给 在数据处理领域中, 定的数据结构中查找所需要处理的数据元 素. 另一常见的运算是对给定的数据结构进行 重新分类, 重新分类,或按数据元素的大小重新进行 排序,以方便对数据元素的处理. 排序,以方便对数据元素的处理. 查找与排序是数据处理的基本技术.本章 查找与排序是数据处理的基本技术. 主要介绍线性表查找与排序的基本方法, 主要介绍线性表查找与排序的基本方法, 以及索引存储结构下的查找技术. 以及索引存储结构下的查找技术.
查找的基本概念
关键字
是数据元素中可以唯一标识一个数据元素的数据项,比 如学号,身份证号等
查找
是根据给定的关键值,在一组数据中确定一个其关键字 等于给定值的数据元素的过程
确切定义
给定一个值K,在n个记录中进行搜索,寻找一个其关键 字等于给定的K值的记录,如找到,则输出记录称查找 成功;否则输出查找不成功的信息称查找失败 查找的结果: 查找成功:找到满足条件的记录 查找失败:找不到满足条件的记录
线性表上进行查找的方法主要有3种:顺序查找,二分查找和分块查 线性表上进行查找的方法主要有3 顺序查找, 找.
1,顺序查找 顺序查找的基本方法是,从线性表的第一个元素 顺序查找的基本方法是, 开始, 开始,依次将线性表中的元素与被查元素进行比 较,若遇到线性表中某位置上的元素与被查元素 相等,则表示找到(即查找成功); );若线性表中 相等,则表示找到(即查找成功);若线性表中 所有的元素与被查元素进行比较都不相等, 所有的元素与被查元素进行比较都不相等,则表 示线性表中不存在需要找的元素(即查找失败). 示线性表中不存在需要找的元素(即查找失败).
二分法的优缺点 二分法查找的优点是平均检索长度小,为 二分法查找的优点是平均检索长度小, 1og n 2. 二分法查找的缺点是它要求记录必须按关 键字有序, 键字有序,并且只适用于顺序方式存储的 顺序表. 顺序表.
3,分块查找(又称索引顺序查找) 从整体来看,线性表不是有序表,如果将线性表 从整体来看,线性表不是有序表, 分成若干个子表,虽然每一子表也不是有序的, 分成若干个子表,虽然每一子表也不是有序的, 但各个子表之间却是有序的, 但各个子表之间却是有序的,这样的线性表称为 分块有序表. 分块有序表. 分块有序表的结构可以分为两部分. 分块有序表的结构可以分为两部分. ① 线性表本身采用顺序存储结构. 线性表本身采用顺序存储结构. ② 再建立一个索引表. 再建立一个索引表.
例:对于一组关键字序列(25,74,36,15,40,29,82, 对于一组关键字序列( , , , , , , , 19,65,33,57,47,50)选取函数 , , , , , ) h(key)=key%13 建立记录与其在检索表中的存储位置之间的关系如下表
存储位置(h(key)) 记录(key)
low=mid+1 ( 08, Low ( 08, 14, 23, 14, 23,
37,
46,
( 08,
14,
23,
37,
46,
55,
二分法查找的算法 int binsearch (sqlist L, int key) { int low, high, mid; high=L.lenlow=0; high=L.len-1; while (low<=high) { mid=(low+high)/2; if (L.elem[mid]==aidkey) return mid; high=midif (L.elem[mid]>aidkey) high=mid-1; if (L.elem[mid]>aidkey) low=mid+1; } return -1; }
(1)直接地址法
h(key)=a× (其中 为常数) h(key)=a×key+b (其中 a和b为常数)
当a=1和b=0时,即为关键字本身的值作为哈希地址. a=1和b=0时 即为关键字本身的值作为哈希地址. 特点:一对一,地址集合和关键字集合大小相同, 特点:一对一,地址集合和关键字集合大小相同, 不发生地址冲突 该方法适用于分布连续或基本连续的情况 如:年龄统计:h(key)=key 年龄统计: 年份统计: h(key)=key-1948 年份统计: h(key)=key-
哈希函数:将关键字映射为检索表中适当存储位置的函数 哈希函数: h(key).(也称杂凑函数). .(也称杂凑函数 .(也称杂凑函数). 哈希地址:利用哈希函数来实现从记录的关键字值到该记 哈希地址: 录的检索表中存储位置地址的计算, 录的检索表中存储位置地址的计算,哈希函数 的值称作哈希地址(散列地址或杂凑地址). 的值称作哈希地址(散列地址或杂凑地址). 哈希方法: 哈希方法:把利用哈希函数组织检索表并利用哈希函数进 行检索的方法(散列法或杂凑法). 行检索的方法(散列法或杂凑法). 哈希表:采用哈希技术将记录存储在一块连续的存储空间 哈希表: 这块连续的存储空间称为哈希表. 中,这块连续的存储空间称为哈希表. 哈希技术中必须解决的两个问题: 哈希技术中必须解决的两个问题: 1,如何选择一个计算简单且地址冲突尽可能少的哈希函数; ,如何选择一个计算简单且地址冲突尽可能少的哈希函数; 2,在出现地址冲突时采用怎样的办法来消解冲突. ,在出现地址冲突时采用怎样的办法来消解冲突.
0 65
1
2
3
4
5
6
7
8
9
10 11
12 25
40 15 29 82 57 19 33 47 74 36 50
如检索key=57的记录,通过h(57)=57%13=5知关键字值为57的记录 如检索key=57的记录,通过h(57)=57%13=5知关键字值为57的记录 key=57的记录 h(57)=57%13=5知关键字值为57 在检索表的存储位置5 在检索表的存储位置5处.
顺序查找的算法: : int sqsearch (sqlist R[], keytype k) { int i=n; R[0].key=k; //设置 设置R[0]为监视哨 设置 为监视哨 while(R[i].key!=k) i--; return i; //返回检索结果 返回检索结果i 返回检索结果 }
4,树的查找
二叉排序树查找
从二叉排序树的根结点开始与被查值进行 比较: 比较: ① 若被查值等于根结点值,则查找成功, 若被查值等于根结点值,则查找成功, 查找过程结束. 查找过程结束. ② 若被查值小于根结点值,则到左子树中 若被查值小于根结点值, 去查找. 去查找. ③ 若被查值大于根结点值,则到右子树中 若被查值大于根结点值, 去查找. 去查找.