当前位置:文档之家› 第三章查找与排序技术

第三章查找与排序技术

重点、难点:
理解各种查找与排序算法的基本思想,并根据问 题要求选用合适的数据结构,写出具体算法。
3.1 基本查找技术
3.1.1 查找的基本概念
查找,也称为检索。是数据处理中最基本的操作之一.在我 们日常生活中,随处可见查找的实例。如查找某人的地址、电 话号码;查某单位45岁以上职工等,都属于查找范畴。本书 中,我们规定查找是按关键字进行的。
i
jk
经过一次比较后情形(因V(k)=68>x , 故 j=k-1=4,k=(i+j)/2=2
[ 8 17 25 44 ] 68 77 98 100 115 125
ik
j
经过二次比较后情形 (因V(k)=17,查找成功
查找x=120的示意图
[ 8 17 25 44 68 77 98 100 115 125 ]
关键字(key):数据元素(或记录)中某个数据项的值, 用它可以标识(或识别)一个数据元素。
例如,描述一个考生的信息,可以包含:考号、姓名、性 别、年龄、家庭住址、电话号码、成绩等关键字。但有些关键 字不能唯一标识一个数据元素,而有的关键字可以唯一标识一 个数据元素。如考生信息中,姓名不能唯一标识一个数据元素 (因有同名同姓的人),而考号可以唯一标识一个数据元素(每 个考生考号是唯一的,不能相同)。我们将能唯一标识一个数 据元素的关键字称为主关键字,而其它关键字称为辅助关键字 或从关键字。
i 初始情况(i=1 , j=10 , k=(i+j)/2=5)
j
8 17 25 44 68 [ 77 98 100 115 125 ]
ki
j
经过一次比较后情形(因V(k)=68<x , 故 i=k+1=6,k=(i+j)/2=8
8 17 25 44 68 77 98 100 [ 115 125 ]
3.1.3 有序表的对分查找
如果线性表中元素是按其值递增或递减排列,则在进行 查找时可不必逐个比较,而可采用跳跃式查找,称对分查找 (折半查找或二分查找)。
1、对分查找的基本思想
设有序线性表的长度为n,被查元素为x。首先将待查元 素x与线性表的中间项进行,分三种情况 ① 相等,则查找成功; ② 若x小于中间项,则在线性表的前半部分以相同的方法继
kij 经过二次比较后情形 (因V(k)=100<x, 故 i=k+1=9,k=(i+j)/2=9
8 17 25 44 68 77 98 100 115 [ 125 ]
k ij 经过三次比较后情形 (因V(k)=115<x, 故 i=k+1=10,k=(i+j)/2=10
经过三8次比17较后25情形44(因68V(k7)7=1195<8x, 1故00i=k1+1=59,[ 1k2=5(i+]j)/2=9
3.1.2 顺序查找
基本思想:从表的一端开始,顺序扫描线性表,依次将扫描 到的结点关键字和待找的值K相比较,若相等,则查找成功, 若整个表扫描完毕,仍末找到关键字等于K的元素,则查找 失败。
从上述算法设计思想可看出,当查找的结点很多时,顺 序查找效率低,而且算法执行时间与被查元素位置有关。如 在第一个,查找一次成功;如在最后一个或不存在,则必须 搜索完整个表。但这种算法比较简单,对数据结构也无特殊 要求,既适用于顺序结构,也适用于链式结构。
算法3.2 在头指针为Head的线性表中查找元素x在表中位置
PROCEDURE LSERCH(V, Next , Head, x, k) k=Head; while ( k≠0) AND ( V(k) ≠x) DO k=Next(k) ; IF k=0 THEN k=-1 RETURN;
顺序查找法的时间复杂度为 O(n) 空间复杂度为 O(1)
第三章 查找与排序技术
3.1 基本查找技术 3.2 哈希(Hash)表技术 3.3 基本的排序技术 3.4 二叉排序树及其查找
本章主要介绍:
常用的查找(顺序查找、有序表的对分查找、分 块查找、二叉排序树的构造及查找)与排序(冒泡排 序、快速排序、插入排序、希尔排序、选择排序、堆 排序)算法,阐明这些算法的基本思想,讨论当采用 不同的数据结构时,算法的实现及效率。
例如,假设给定有序表中关键字为: {8,17,25,44,68,77,98,100,115,125},将查找x=17和x=120。
查找x=17的示意图
[ 8 17 25 44 68 77 98 100 115 125 ]
iห้องสมุดไป่ตู้
j
初始情况(i=1 , j=10 , k=(i+j)/2=5)
[ 8 17 25 44 ] 68 77 98 100 115 125
续查找; ③ 若x大于中间项,则在线性表的后半部分以相同的方法继
续查找; 这个过程一直进行到查找成功或子表长度为0(查找失
败)为止。
i
x=y 时找到
x<y 时找这一半
y
x>y 时找这一半
j
从上述查找思想可知,每进行一次关键字比较,区间数 目增加一倍,故称为对(二)分(区间一分为二),而区间长 度缩小一半,故也称为折半(查找的范围缩小一半)。即每 次可减少一半的工作量,因而查找效率较高。但它仅适用于 有序表,且只限于顺序存储结构。而对无序表或链式存储结 构无能为力(因链式存储结构地址不连续,不能确定中间项y 的地址)。
有了主关键字及关键字后,我们可以给查找下一个完整的 定义。
查找:根据给定的值,在一个表中查找出其关键字等于给定值 的数据元素,若表中有这样的元素,则称查找成功;若表中 不存在这样的记录,则称查找失败。
因为查找是对已存入计算机中的数据所进行的操作,所 以采用何种查找方法,首先取决于使用哪种数据结构来表示 “表”,即表中结点是按何种方式组织的。为了提高查找速 度,我们经常使用某些特殊的数据结构来组织表。因此在研 究各种查找算法时,我们首先必须弄清这些算法所要求的数 据结构,特别是存储结构。
算法3.1 在顺序存储的长度为n的线性表中查找元素x在表中位置
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=-1
>0 表示找到 V(k)=x
RETURN;
返回值k
=-1 表示未找到k>n且V(k) ≠x
相关主题