查找、

查找
关键码:可以标识一个记录的某个数据项。
键值:关键码的值。
主关键码:可以唯一地标识一个记录的关键码。
次关键码:不能唯一地标识一个记录的关键码。
查找 :在具有相同类型的记录构成的集合中找出满足 给定条件的记录。
查找的结果 :若在查找集合中找到了与给定值相匹配 的记录,则称查找成功;否则,称查找失败。
静态查找 :不涉及插入和删除操作的查找 。
动态查找 :涉及插入和删除操作的查找。
静态查找适用于:查找集合一经生成,便只对其进行 查找,而不进行插入和删除操作,或经过一段时间的 查找之后,集中地进行插入和删除等修改操作;
动态查找适用于:查找与插入和删除操作在同一个阶 段进行,例如当查找成功时,要删除查找到的记录, 当查找不成功时,要插入被查找的记录。
查找结构 :面向查找操作的数据结构 ,即查找基于的 数据结构。
线性表:适用于静态查找,主要采用顺序查找技术、 折半查找技术。
树表:适用于动态查找,主要采用二叉排序树的查找 技术。
散列表:静态查找和动态查找均适用,主要采用散列 技术。
平均查找长度:将查找算法进行的关键码的比较次数 的数学期望值定义为平均查找长度。计算公式为:
其中:n:问题规模,查找集合中的记录个数; pi:查找第i个记录的概率; ci:查找第i个记录所需的关键码的比较次数。 ASL ∑ = = n i i icp1
顺序查找 (线性查找)
int SeqSearch1(int r[ ], int n, int k)
//数组r[1] ~ r[n]存放查找集合
{ i=n; while (i>0&&r[i]!=k) i–; returni; }
改进的顺序查找
int SeqSearch2(int r[ ], int n, int k)
//数组r[1]~r[n]存放查找集合
{ r[0]=k;i=n; while(r[i]!=k) i–; returni; }
顺序查找的缺点:平均查找长度较大,特别是当待查找集合中元素较多 时,查找效率较低。
顺序查找的优点:算法简单而且使用面广。 对表中记录的存储没有任何要求,顺序存储和链接 存储均可; 对表中记录的有序性也没有要求,无论记录是否按 关键码有序均可。
折半查找——非递归算法
int BinSearch1(int r[ ], int n, int k)
//数组r[1]~r[n]存放查找集合
{ low=1;high=n; while(low<=high) { mid=(low+high)/2; if(k<r[mid]) high=mid-1; elseif(k>r[mid]) low=mid+1; elsereturnmid; } return0; }
折半查找——递归算法
intBinSearch2(intr[],intlow, inthigh,intk)
//数组r[1]~r[n]存放查找集合
{ if(low>high)return0; else{ mid=(low+high)/2; if(k<r[mid]) returnBinSearch2(r, low, mid-1,k); else if(k>r[mid]) returnBinSearch2(r, mid+1,high,k); elsereturnmid; } }
二叉排序树(也称二叉查找树):或者是一棵空的二 叉树,或者是具有下列性质的二叉树: ⑴ 若它的左子树不空,则左子树上所有结点的值均 小于根结点的值; ⑵ 若它的右子树不空,则右子树上所有结点的值均 大于根结点的值; ⑶ 它的左右子树也都是二叉排序树。
排序:给定一组记录的集合{r1, r2, ……, rn},其相应 的关键码分别为{k1, k2, ……, kn},排序是将这些记录 排列成顺序为{rs1, rs2, ……, rsn}的一个序列,使得相应 的关键码满足ks1≤ks2≤……≤ksn( 称为升序) 或 ks1≥ks2≥……≥ksn(称为降序)。 正序:待排序序列中的记录已按关键码排好序。 逆序(反序):待排序序列中记录的排列顺序与排好 序的顺序正好相反。
单键排序:根据一个关键码进行的排序; 多键排序:根据多个关键码进行的排序。

  1. 内排序:在排序的整个过程中,待排序的所有记录 全部被放置在内存中
  2. 外排序:由于待排序的记录个数太多,不能同时放 置在内存,而需要将一部分记录放置在内存,另一部 分记录放置在外存上,整个排序过程需要在内外存之 间多次交换数据才能得到排序的结果。
    基于比较的内排序 1. 插入排序 2. 交换排序 3. 选择排序 4. 归并排序

直接插入排序算法简单、容易实现,适用于待排 序记录基本有序或待排序记录较小时。 当待排序的记录个数较多时,大量的比较和移动 操作使直接插入排序算法的效率降低。
插入排序:将整个待排序记录分割成若干个子序列, 在子序列内分别进行直接插入排序,待整个序列中的 记录基本有序时,对全体记录进行直接插入排序。
基本有序:接近正序,例如{1, 2, 8, 4, 5, 6, 7, 3, 9};
局部有序:部分有序,例如{6, 7, 8, 9, 1, 2, 3, 4, 5}。
局部有序不能提高直接插入排序算法的时间性能。
交换排序的主要操作是交换,其主要思想是: 在待排序列中选两个记录,将它们的关键码相 比较,如果反序(即排列顺序与排序后的次序 正好相反),则交换它们的存储位置。
起泡排序算法

voidBubbleSort(intr[],intn)
{
exchange=n; while (exchange) {
bound=exchange; exchange=0; for(j=1;j<bound;j++) if (r[j]>r[j+1]) {
r[j]←→r[j+1]; exchange=j;
} } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值