- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第四部分的 查找与排序技术(new)
2.6 查找与排序 2.6.1 查找的基本概念 所谓查找:根据一个给定的元素,在数据结构中根据不同策略确定符合给定元素值的数据元素的过程。 2.6.2 静态查找技术 根据策略可以分成三大类: 1、顺序查找法 2、有序表的对分查找法 3、分块查找法 1 顺序查找法 顺序查找法又称为顺序搜索法。基本方法如下: 1、从线性表的第一个元素开始,依次将线性表中元素与给定元素的值进行比较。 2、相等则表示找到,否则表示失败。如果遍历了整个表都没有找到,说明表中没有要找的元素。 从上面的方法来看,其顺序查找的效率很低,但在以下两种情况中,却只能使用顺序查找法: 1、线性表是无序表 2、采用链式存储的有序线性表 2 有序表的对分查找法 对分查找法,只应用于顺序存储的有序表。 假设有序线性表的长度为n,被查元素为x,则对分法如下: 1、将x与线性表的中间项进行比较,若中间项的值等于x,说明查找成功; 2、若x小于中间项,则在表的前面部分进行相同的查找,否则在表的后面部分进行查找。 3、此过程直到查找成功或者子表长度为0时结束。 对分查找法在最坏的情况下,也只比较log2N次 算法程序 int search_SL_List(int *v,int start,int end,int x) { int k ; while(start = end){ k = (start + end)/2; if(v[k] == x) return k; if(v[k] x) start = k + 1; else end = k -1; } return -1; } 3 分块查找 分块查找又称索引顺序查找。它是一种顺序查找的改进策略,用于在分块有序表中查找。 所谓分块是指将长度为N的线性表分成M个子表,各子表的长度可以相等,也可以不相等,但要求后一子表的每一个元素都要大于前一个子表的所有元素。 分块有序表的结构可以分为两部分: 1、线性表本身是顺序存储结构 2、再建立一个索引表,线性表中每个子表建立一个索引节点。索引节点包括两部分:一是数据域,一是指针域。数据域存放对应子表中的最大元素值,指针域用于指示子表第一个元素的在整个表中序号。 3 分块查找 上图查找过程:首先查找索引表,确定查找的子表,然后再相应的子表中应顺序表查找法查找。 struct indnode { int key; int k; }; 二叉排序树的定义 二叉排序树可能为一棵空的二叉树,若非空则必须满足以下特征: (1)根结点左子树中所有结点的关键字小于根结点的关键字; (2)根结点右子树中所有结点的关键字大于或等于根结点的关键字; (3)根结点的左右子树也都是二叉排序树。 一棵二叉排序树 2.6.3 动态查找技术 建立了二叉排序树之后,若查找过程中不插入或删除元素(静态查找),则在二叉排序树中查找方法为: 1)将给定数据key与根结点关键字x进行比较,若key=x则查找成功; 2)若keyx,则与左子树的根结点的关键字值进行比较; 3)若keyx,则与右子树的根结点的关键字值进行比较。 重复上述步骤,直到查找成功;或者一直比较到叶子结点也找不到目标元素,则查找失败。 可定义二叉排序树结点如下: typedef struct Node { KeyType x; //关键字 struct Node *left, *right; }BinNode; typedef BinNode * BinNodePtr; 二叉排序树查找算法(静态查找)实现: BinNode *search_btree(BinNodePtr p, KeyType key) { while(p!=NULL p-x!=key ) { if( keyp-x ) p=p-left; else p=p-right; } return p; } 进行动态查找时,查找过程还涉及到插入新结点。其方法为: (1)在二叉排序树中查找数据key(按前一页的方法),若查找成功则程序中止,若查找失败则转入下面插入过程(2) (2)以数据key作为关键字建立新结点,假定查找过程最后到达某叶子结点,比较key与此叶子结点的关键字,若key小于后者则将新结点插入为叶子结点的左孩子,若key大于后者则新结点插入为叶子结点的右孩子。 例:动态查找{10,6,19,22,8,2} 动态查找过程也是生成二叉排序树的过程。假定由整数序列{10,6,19,22,8,2}生成一棵二叉排序树,可以采用逐个元素插入的方法实现。 (1) 首先将10作为根结点(2)
文档评论(0)