- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第三章_查找与排序技术1
1 第三章 查找与排序技术 第三章 查找与排序技术 3.1 基本查找技术 查找:在一个给定的数据结构中查找某个指定的元素。 通常,根据不同的数据结构,应该采用不同的查找方法: 顺序查找; 有序表的对分查找; 分块查找。 3.1.1 顺序查找 顺序查找(顺序搜索):在线性表中顺序查找指定的元素。 顺序查找的基本方法:从线性表的第一个元素开始,依次将线性表中的元素与被查元素进行比较,若有相等则表示找到(查找成功);若线性表中的所有元素都与被查元素进行了比较但都不相等,则表示线性表中没有要找到的元素(查找失败)。 举例说明 举例:设A是n个元素的一维数组。对于指定的输入x,如果x在数组中,则顺序找到它第一次出现处的下标; 如果x在数组中,则以下标作为查找结果。否则以-1作为结果 #define n 5 /* n为查找表中元素个数的最大可能值*/ #define MAXLEN n+1 int seqsearch(int A[],int k) { int i; i=0; A[MAXLEN-1]=k; while (A[i]!=k) i++; if(iMAXLEN-1) return i; /*查找成功,返回被查元素在表中的相对位置*/ else return -1; /*查找失败,返回-1*/ } #include stdio.h void main() { int j,a[]={11,21,2,45,90},h=8; j=seqsearch(a,h); printf(%d,j); } 顺序查找的效率 如果线性表中的第一个元素就是被查找元素,只需要做一次比较就查找成功; 如果被查的元素是线性表中的最后一个元素,或者被查元素根本不在线性表中,则需要与线性表中的所有元素进行比较(最坏情况); 平均情况:利用顺序查找法在线性表中查找一个元素,大约要与线性表中一半的元素进行比较。 结论 对于大的线性表来说,顺序查找的效率是很低的。但在下列两种情况下也只能采用顺序查找: 如果线性表为无序表(表中元素的排列是无序的),则不管是顺序存储结构还是链式存储结构,都只能用顺序查找表; 即使是有序线性表,如果采用链式存储结构,也只能用顺序查找。 3.1.2 有序表的对分查找 有序表:线性表中的元素按值非递减或者非递增排列。 对分查找的过程:将被查找关键字与线性表中间的项目进行比较,有三种可能: 若被查关键字与表中间的项目相等,则查到,过程结束; 若被查关键字大于表中间的项目,则取表的后半部分作为新表再去查找; 若被查关键字小于表中间的项目,则取表的前半部分作为新表再去查找。 时间效率分析 对分查找是根据每次试探的结果将线性表的规模减半,并有规则地括出可能包含被查项目的部分。 最坏情况:对查找需要的比较次数为 n为线性表的长度。 局限性:只适用于有序表,且只限于顺序存储结构。 #define n 6 /* n为查找表中元素个数的最大可能值*/ #define MAXLEN n int binsearch(int A[], int k) { int low,mid,high; low=0; high=MAXLEN-1; while (low=high) { mid=(low+high)/2; if (k==A[mid]) return mid; /*查找成功,返回被查元素在表中的相对位置*/ else if(kA[mid]) low=mid+1; else high=mid-1; } return -1; /*查找失败,返回-1*/ } #include stdio.h void main() { int j,a[]={2,11,21,45,77,90},h=90; j=binsearch(a,h); printf(%d,j); } 3.1.3 分块查找 分块查找又称索引查找,是顺序查找的一种改进方法,用于在“分块有序”表中进行查找。 “分块有序”表:将长度为n的线性表L分成m个子表(各子表的长度可以不等,也可以相等),且后一个子表中的每一项均大于前一个子表中的所有项。 分块有序表 分块有序表的结构可以分为两部分: (1)线性表本身采用顺序存储结构也可以采用链式存储结构。 (2)再建立一个索引表。在索引表中,对线性表的每个子表建立一个索引结点,每个结点包括两个域:一是数据域,用于存放对应子表中的最大元素值;二是指针域,用于指示对应子表的第一个元素在整个线性表中的序号或者地址。 分析 根据分块有序表的结构,其查找过程可以分以下两步进行: (1)首先查找索引表,以便确定被查元素所在的子表。由于索引表数据域中
您可能关注的文档
最近下载
- 金华市市属事业单位招聘考试真题2024.docx VIP
- 山东司法警官职业学院教师招聘考试题库真题2023.docx VIP
- 2023年雅思听力同义替换汇总.pdf VIP
- 2025年内蒙古自治区赤峰市统招专升本医学综合自考真题(含答案).docx VIP
- 美国重型颅脑损伤诊治指南解读.pptx VIP
- 2023年内蒙古自治区赤峰市统招专升本医学综合自考真题(含答案).docx VIP
- 【三菱】FX3G·FX3U·FX3UC系列PLC 编程手册(基本·应用指令说明书).pdf VIP
- 范用:泥土·脚印.pdf VIP
- 房建项目施工施工项目重点难点分析.docx VIP
- 水电孤岛直流送出系统的频率稳定性研究.pptx VIP
原创力文档


文档评论(0)