查找排序PPT课件

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(4)若 S[ mid ] = key,说明查找成功,元素序号=mid; 结束条件: (1)查找成功 : S[mid] = key
(2)查找不成功 : high≤low (意即区间长度小于0)
9
查找23和79的过程如下图:
mid=(low+high)/2
( 08, 14, 23, 37, 46, 55, 68, 79, 91 ) ( 08, 14, 23, 37, 46, 55, 68, 79, 91 )
low=1; high=n;
while(low<=high)
{ mid=(low+high)/2;
if(ST[mid].key= = key) return (mid); /*查找成功*/
else if( key< ST[mid].key) high=mid-1; /*在前半区间继续查找*/
若k==r[mid].key,查找成功 若k<r[mid].key,则high=mid-1 若k>r[mid].key,则low=mid+1
❖重复上述操作,直至low>high时,查找失败 特点:比顺序查找方法效率高。最坏的情况下,需要比较 log2n次。
8
折半查找举例: 已知如下11个元素的有序表:
(05 13 19 21 37 56 64 75 80 88 92), 请查找关键字为21
和85的数据元素。
Low指向待查元 素所在区间的下 界
mid指向待查元素所在 区间的中间位置
high指向待查元素所 在区间的上界
解:① 先设定3个辅助标志: low,high,mid, 显然有:mid= (low+high)/2
7
思想:先确定待查找记录所在的范围,然后逐步缩小范 围,直到找到或确认找不到该记录为止。
适用条件:必须在具有顺序存储结构的有序表中进行。
算法实现
❖设表长为n,low、high和mid分别指向待查元素所在区 间的上界、下界和中点,k为给定值 ❖初始时,令low=1,high=n,mid=(low+high)/2 ❖让k与mid指向的记录比较
② 运算步骤:
(1) low =1,high =11 ,故mid =6 ,待查范围是 [1,11]; (2) 若 S[mid] < key,说明 key[ mid+1,high] ,
则令:low =mid+1;重算 mid= (low+high)/2;.
(3) 若 S[mid] > key,说明key[low ,mid-1], 则令:high =mid–1;重算 mid ;
low mid
( 08, 14, 23, 37, 46, 55, 68, 79,
high
91 )
91 )
91 )
high
91 )
high
91 )
low h1i0gh mid
折半查找的c语言算法程序:
int Search_Bin( SSTable ST[ ], int n, int key)
{int low, high,mid;
low
mid
( 08, 14, 23, 37, 46, 55, 68, 79,
low mid
high=mid-1
( 08, 14, 23, 37, 46, 55, 68, 79,
low=mid+1
high
mid
( 08, 14, 23, 37, 46, 55, 68, 79,
low
mid
( 08, 14, 23, 37, 46, 55, 68, 79,
数据结构课程的内容
1
查找和排序
查找
一、顺序查找(线性查找) 二、折半查找(二分查找) 三、分块查找(索引顺序查找) 四、二叉排序树及查找
排序
一、选择排序 二、插入排序 三、交换排序(冒泡排序和快速排序)
2
基本概念:
1 查找
是一种数据结构
查找表 ——由同一类型的数据元素(或记录)构成的集合。 查 找 ——查询特定元素是否在表中。 查找成功 ——若表中存在特定元素,称查找成功,应输出该记录;
❖ 对顺序结构如何线性查找? ❖ 对单链表结构如何线性查找? ❖ 对树结构如何顺序查找?
见下页例子
从头指针开始 “顺藤摸瓜”
用各种遍历算法
4
对顺序结构查找算法的实现技巧: 把待查关键字key存入表头或表尾(俗称“哨兵”),这 样可以加快执行速度。
int Search_Seq(KeyType key ) { S[0] =key/;/在顺序表S中,查找关键字与key相同的元素;
查找不成功 ——否则,称查找不成功(也应输出失败标志或失败位置)
静态查找 ——只查找,不改变集合内的数据元素。
动态查找 ——既查找,又改变(增减)集合内的数据元素 (例如二叉排序树)。
关键字
——是预先确定的某种标志,即记录中某个数据项 的值,可用来识别一个记录。
3
一、顺序查找( 又称线性查找 )
顺序查找:按顺序逐一比较,查找关键字。
若成功,返回其位置信息,否则返回0
for( i=length/;/设S[立i ]哨!=兵k,ey可; 免- -去i 查);找过程中每一步都要检
测是否查找完毕。当n>1000时,查找时间将
return i;减少一半/。/不要用for(i=n; i>0; - -i)
} // Sear/c/h百度文库_S不eq到=不成功,或返f回or值(i必=1为; i=<0=;n; i+ +) 找得到=成功,返回值i正那好样代太表慢所找元素的位置。
5
讨论:怎样衡量查找效率?
——用平均查找长度(ASL)衡量。
如何计算ASL?
分析: 查找第1个元素所需的比较次数为1; 查找第2个元素所需的比较次数为2; …… 查找第n个元素所需的比较次数为n;
总计全部比较次数为:1+2+…+n = (1+n)n/2 因为是计算某一个元素的平均查找次数,还应当除以n, (假设查找任一元素的概率相同) 即: ASL=(1+n)/2 ,时间效率为 O(n)
6
小结: 顺序查找的特点: 优点:算法简单,且对顺序结构或链表结构均适用。 缺点: ASL 太大,时间效率太低。 如何改进?
二、折半查找(又称二分查找或对分查找)
这是一种容易想到的查找方法。
先给数据排序(例如按升序排好),形成 有序表,然后再将key与正中位置的元素相比, 若key小,则缩小至右半部内查找;再与其中 位元素比较,每次缩小1/2的范围,直到查找 成功或失败为止。
相关文档
最新文档