`
sunxboy
  • 浏览: 2869949 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

查找算法集:顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现)(转)

阅读更多
java 代码
  1. // search.cpp : Defines the entry point for the console application.   
  2. //   
  3.   
  4. #include "stdafx.h"  
  5. #include "LinkTable.h"  
  6. #define        MAX_KEY  500  
  7.   
  8. //------------------------------数组实现部分----------------------------------   
  9. /**//*  
  10.     无序数组顺序查找算法函数nsq_Order_Search<用数组实现>  
  11.     参数描述:  
  12.         int array[]    :被查找数组  
  13.         int n        :被查找数组元素个数  
  14.         int key        :被查找的关键值  
  15.     返回值:  
  16.         如果没有找到:    nsq_Order_Search = -1  
  17.         否则:            nsq_Order_Search = key数组下标  
  18. */  
  19. int nsq_Order_Search(int array[],int n,int key)   
  20. ...{   
  21.     int i;   
  22.     array[n] = key;   
  23.     /**//*for循环后面的分号必不可少*/  
  24.     for(i=0;key!=array[i];i++);   
  25.     return(i<n?i:-1);   
  26. }   
  27. /**//*  
  28.     有序数组顺序查找算法函数sq_Order_Search<用数组实现>  
  29.     参数描述:  
  30.         int array[]    :被查找数组  
  31.         int n        :被查找数组元素个数  
  32.         int key        :被查找的关键值  
  33.     返回值:  
  34.         如果没有找到:    sq_Order_Search = -1  
  35.         否则:            sq_Order_Search = key数组下标  
  36. */  
  37. int sq_Order_Search(int array[],int n,int key)   
  38. ...{   
  39.     int i;   
  40.     array[n] = MAX_KEY;   
  41.     /**//*for循环后面的分号必不可少*/  
  42.     for(i=0;key>array[i];i++);   
  43.     if(i<n && array[i] == key)   
  44.         return(i);   
  45.     else  
  46.         return(-1);   
  47. }   
  48. /**//*  
  49.     有序数组二分查找算法函数sq_Dichotomy_Search0<用数组实现>  
  50.     参数描述:  
  51.         int array[]    :被查找数组  
  52.         int n        :被查找数组元素个数  
  53.         int key        :被查找的关键值  
  54.     返回值:  
  55.         如果没有找到:    sq_Dichotomy_Search0 = -1  
  56.         否则:            sq_Dichotomy_Search0 = key数组下标  
  57. */  
  58. int sq_Dichotomy_Search0(int array[],int n,int key)   
  59. ...{   
  60.     int low,high,mid;   
  61.     low = 0;   
  62.     high = n - 1;   
  63.        
  64.     while(low<=high)   
  65.     ...{   
  66.         mid = (high+low)/2;   
  67.         if(array[mid] == key)   
  68.             return(mid);   
  69.         /**//*key>array[mid] 表明要求查找的值在[mid+1,high]*/  
  70.         /**//*否则,在[low,mid-1]*/  
  71.         if(key > array[mid])   
  72.             low = mid + 1;   
  73.         else  
  74.             high = mid - 1;   
  75.     }   
  76.     return(-1);   
  77. }   
  78. /**//*  
  79.     有序数组插值查找算法函数sq_Dichotomy_Search1<用数组实现>  
  80.     (插值查找算法是二分查找算法的改进)  
  81.     参数描述:  
  82.         int array[]    :被查找数组  
  83.         int n        :被查找数组元素个数  
  84.         int key        :被查找的关键值  
  85.     返回值:  
  86.         如果没有找到:    sq_Dichotomy_Search1 = -1  
  87.         否则:            sq_Dichotomy_Search1 = key数组下标  
  88. */  
  89. int sq_Dichotomy_Search1(int array[],int n,int key)   
  90. ...{   
  91.     int low,high,        //二分数组的上,下标   
  92.         pos;            //查找码的大致(估算)位置   
  93.     low = 0;   
  94.     high = n-1;   
  95.     while(low <= high)   
  96.     ...{   
  97.         pos = (key-array[low])/(array[high]-array[low])*(high-low)+low;   
  98.         /**//*找到关键值,中途退出*/  
  99.         if(key == array[pos])   
  100.             return(pos);   
  101.         if(key > array[pos])   
  102.             low = pos + 1;   
  103.         else  
  104.             high = pos - 1;   
  105.     }   
  106.     /**//*没有找到,返回-1*/  
  107.     return(-1);   
  108. }   
  109. //------------------------------数组实现部分----------------------------------   
  110. //------------------------------链表实现部分----------------------------------   
  111. /**//*  
  112.     无序链表顺序查找算法函数nlk_Order_Serach<用链表实现>  
  113.     [查找思想:遍历链表的所有节点]  
  114.     参数描述:  
  115.         Node *head    :被查找链表的首指针  
  116.         int key        :被查找的关键值  
  117.     返回值:  
  118.         如果没有找到:    nlk_Order_Serach = NULL  
  119.         否则:            nlk_Order_Serach = 键值为key的节点的指针  
  120. */  
  121. Node *nlk_Order_Serach(Node *head,int key)   
  122. ...{   
  123.     for(;head!=NULL && head->data != key;head = head->link);   
  124.     return(head);   
  125. }   
  126. /**//*  
  127.     有序链表顺序查找算法函数lk_Order_Serach<用链表实现>  
  128.     [查找思想:依次遍历链表的节点,发现节点不在key的范围时提前结束查找]  
  129.     参数描述:  
  130.         Node *head    :被查找链表的首指针  
  131.         int key        :被查找的关键值  
  132.     返回值:  
  133.         如果没有找到:    lk_Order_Serach = NULL  
  134.         否则:            lk_Order_Serach = 键值为key的节点的指针  
  135. */  
  136. Node *lk_Order_Search(Node *head,int key)   
  137. ...{   
  138.     for(;head!=NULL && head->data < key;head=head->link);   
  139.     /**//*当遍历指针为NULL或没有找到键值为key的节点,返回NULL(表明没有找到)*/  
  140.     /**//*否则,返回head(表明已经找到)*/  
  141.     return(head==NULL || head->data != key ? NULL : head);   
  142. }   
  143. /**//*  
  144.     有序链表动态查找算法函数lk_Dynamic_Search<用链表实现>  
  145.     [查找思想:依次遍历链表的节点,发现节点不在key的范围时提前结束查找]  
  146.     参数描述:  
  147.         Node *head:    被查找链表的首指针  
  148.         Node **p;    键值为key的节点的前驱指针(回传参数)  
  149.         Node **q:    键值为key的节点指针(回传参数)  
  150.         int key    :    被查找的关键值  
  151.     注意:  
  152.         当 *p == NULL 且 *q != NULL,链表的首节点键值为key      
  153.         当 *p != NULL 且 *q != NULL,链表的中间(非首,尾)节点键值为key  
  154.         当 *p != NULL 且 *q == NULL,链表的尾节点键值为key  
  155.         当 *p == NULL 且 *q == NULL,链表是空链表  
  156. */  
  157. void lk_Dynamic_Search(Node *head,Node **p,Node **q,int key)   
  158. ...{   
  159.     Node *pre,*cur;   
  160.     pre = NULL;   
  161.     cur = head;   
  162.     for(;cur != NULL && cur->data < key;pre = cur,cur = cur->link)   
  163.     *p = pre;   
  164.     *q = cur;   
  165. }   
  166. /**//*  
  167.     有序链表动态插入算法函数lk_Dynamic_Insert<用链表实现>  
  168.     参数描述:  
  169.         Node *head:    被插入链表的首指针  
  170.         int key    :    被插入的关键值  
  171.     返回值:  
  172.         lk_Dynamic_Search = 插入键值为key的节点后的链表首指针  
  173. */  
  174. Node *lk_Dynamic_Insert(Node *head,int key)   
  175. ...{   
  176.     Node    
  177.         *x,        //插入节点的前驱节点   
  178.         *y,        //插入节点的后续节点   
  179.         *p;        //插入的节点   
  180.     p = (Node *)malloc(sizeof(Node));   
  181.     p->data = key;   
  182.     p->link = NULL;   
  183.     lk_Dynamic_Search(head,&x,&y,key);   
  184.     if(x==NULL)   
  185.     ...{   
  186.         p->link = x;   
  187.         head = p;   
  188.     }   
  189.     else  
  190.     ...{   
  191.         p->link = x->link;   
  192.         x->link = p;       
  193.     }   
  194.     ListLinkTable(head,"插入节点");   
  195.     return(head);   
  196. }   
  197. /**//*  
  198.     有序链表动态删除算法函数lk_Dynamic_Delete<用链表实现>  
  199.     参数描述:  
  200.         Node *head:    被删除链表的首指针  
  201.         int key    :    被删除的关键值  
  202.     返回值:  
  203.         lk_Dynamic_Delete = 删除键值为key的节点后的链表首指针  
  204. */  
  205. Node *lk_Dynamic_Delete(Node *head,int key)   
  206. ...{   
  207.     Node    *x,        //删除节点的前驱节点   
  208.             *y;        //删除的节点   
  209.     lk_Dynamic_Search(head,&x,&y,key);   
  210.     if(x==NULL)   
  211.         /**//*因为x=NLLL时,y指向首指针*/  
  212.         head = y->link;   
  213.     else  
  214.         x->link = y->link;   
  215.     free(y);   
  216.     ListLinkTable(head,"删除节点");   
  217.     return(head);   
  218. }   
  219. //------------------------------链表实现部分----------------------------------   
  220. int main(int argc, char* argv[])   
  221. ...{   
  222.     Node *head;   
  223.     //Node *p,*x,*y;   
  224.     int KEY;   
  225.     int count,i;   
  226.     //int result;   
  227.     KEY = 11;   
  228.     //PrintArrayValue(TestArray2,DEFAULT_ARRAY_SIZE,"原始");   
  229.     //result = sq_Dichotomy_Search1(TestArray2,DEFAULT_ARRAY_SIZE,KEY);   
  230.     //printf("查找结果是:数组[%d] = %d ",result,TestArray2[result]);   
  231.     head = CreateLinkTable(DEFAULT_ARRAY_SIZE,TestArray2);   
  232.     ListLinkTable(head,"原始");   
  233.     /**//*  
  234.     p = lk_Order_Search(head,KEY);  
  235.     if(p==NULL)  
  236.         printf(" 查找结果是:指定链表中没有[数据域 = %d]的节点! ",KEY);  
  237.     else  
  238.         printf(" 查找结果是:节点.Data = %d 节点.Link = %d 节点.Addr = %d ",p->data,p->link,p);  
  239.     */  
  240.     printf("输入插入节点的个数: ");   
  241.     scanf("%d",&count);   
  242.     for(i=0;i<count;i++)   
  243.     ...{   
  244.         printf("输入插入节点的数据域: ");   
  245.         scanf("%d",&KEY);   
  246.         lk_Dynamic_Insert(head,KEY);   
  247.     }   
  248.     do  
  249.     ...{   
  250.         printf("输入删除节点的数据域: ");   
  251.         scanf("%d",&KEY);   
  252.         lk_Dynamic_Delete(head,KEY);   
  253.     }while(head!=NULL);   
  254.     printf(" 应用程序正在运行...... ");   
  255.     return 0;   
  256. }   
分享到:
评论

相关推荐

    查找算法集(顺序查找、二分查找、插值查找、动态查找)

    以下是四种常见的查找算法:顺序查找、二分查找、插值查找和动态查找。 顺序查找 顺序查找是一种最简单的查找算法,它的实现方式是从数组或链表的第一个元素开始,逐个比较元素直到找到目标元素或达到数组或链表的...

    查找算法集(顺序查找、二分查找、插值查找、动态查找).docx

    根据不同的实现方式和查找策略,查找算法可以分为顺序查找、二分查找、插值查找、动态查找等多种类型。 一、顺序查找算法 顺序查找算法是一种简单的查找算法,它的实现方式是从数组或链表的第一个元素开始,逐个...

    查找(顺序,折半,插值)

    这里我们将深入探讨三种不同的查找算法:顺序查找、折半查找(也称为二分查找)以及插值查找。这些算法在不同的场景下各有优势,了解并熟练掌握它们对于优化程序性能至关重要。 **顺序查找** 顺序查找是最基础的...

    最热门的Java 算法面试题汇总

    **各种查找算法**:斐波那契查找、插值查找、二分查找、顺序查找分别适用于不同场景,具有不同的时间复杂度。 29-39. **各种排序算法**:包括基数排序、桶排序、计数排序、堆排序、快速排序、归并排序、希尔排序、...

    C/C++常用算法手册.秦姣华(有详细书签).rar

    5.4.2 链表结构中的查找算法 148 5.4.3 树结构中的查找算法 151 5.4.4 图结构中的查找算法 152 5.5 小结 153 第6章 基本数学问题 154 6.1 判断闰年 154 6.2 多项式计算 156 6.2.1 —维多项式求值 156 6.2.2...

    数据结构复习大纲

    - **二分查找**:时间复杂度 O(log n)。 - **插值查找**:根据元素之间的数值关系进行查找。 - **分块查找**:将有序表划分为若干个块,每个块内部再进行查找。 - **动态查找表**:动态变化的查找表,支持插入和...

    Adam Drozdek_Data Structures and Algorithms In C++_2nd Edition.pdf

    - 顺序查找和二分查找的原理及其适用场景。 - 插值查找和斐波那契查找等高级查找算法的介绍。 3. **递归与动态规划(Recursion and Dynamic Programming)** - 递归的基本概念及其在解决数学问题中的应用。 - ...

    计算机程序设计艺术(1-3)卷

    查找算法包括顺序查找、二分查找、哈希表查找等,这些在数据库系统、搜索引擎和各种信息检索应用中都有广泛应用。此外,还探讨了关联数组、B树和B+树等高效数据结构,这些在现代数据库系统中扮演着关键角色。 综合...

    构建大顶堆leetcode-data-structures-and-algorithms:数据结构和算法&编码访谈&LeetCode

    有序数组的二分查找 插值查找 模糊二分查找 散列表 支持插入、删除、查找的散列表 分离链接法处理散列表中的冲突 线性探查法处理散列表中的冲突 二叉树 二叉树的前、中、后序以及层次遍历 支持插入、删除、查找的...

    程序员考试大纲

    - **查找算法**:如顺序查找、二分查找等。 - **数值计算算法**:涉及插值、方程求解等。 - **字符串处理算法**:如字符串匹配等。 - **数据压缩算法**:如Huffman编码等。 - **递归算法**:通过递归解决问题的方法...

    计算机程序设计技巧(前三卷)中文版

    查找部分则涉及顺序查找、二分查找、哈希查找等,并讨论了不同查找策略的适用场景和优缺点。此外,还介绍了一些高级主题,如外部排序和多关键字排序。 通过阅读这三卷,读者将能全面掌握计算机程序设计的核心技巧,...

    architect-java:java后端架构师技术图谱

    并根据自己的理解重新进行了整理本文持续更新中本文收录于一、计算机基础1、数据结构(1)基本数据结构数据结构基本概念(时间复杂度和空间复杂度的计算方法)数组链表集合队列栈关联数组跳表倒排索引BitSet(2)树...

    数据结构 B类1

    静态查找表是数据查找的基础,包括顺序查找、二分查找、插值查找和分块查找等方法。散列函数用于将数据映射到特定位置,常见的有直接地址法、除留余数法等,散列碰撞通过线性探测、二次探测或再散列解决。 线性结构...

    我的算法:我的数据结构和算法学习笔记

    我的算法我的算法学习笔记数据结构叠放队列链表BinarySearchTree 组地图eep 段树特里联合查找AVL树红黑树哈希表图形演算法分类气泡分选选择排序插入排序贝壳分类快速分类合并排序堆排序计数排序桶分类基数排序搜索二...

    大连理工大学数据结构经典课件

    二分查找、插值查找、斐波那契查找等则是提高数据查找效率的有效手段。 6. **文件结构**:在大型系统中,数据通常存储在磁盘上,如何高效地读写数据是文件结构研究的主要内容。顺序文件、索引顺序文件、直接存取...

    现在的软件水平考试初级就是程序员

    - **常用算法**:掌握常用的排序算法(如冒泡排序、快速排序)、查找算法(如顺序查找、二分查找)、数值计算算法、字符串处理算法、数据压缩算法、递归算法以及图的相关算法。理解算法与数据结构之间的关系,掌握...

    leetcode减绳子-LeetCode-Offer:力扣优惠去

    顺序查找、二分查找、插值查找、斐波那契查找、树表查找、分块查找、哈希查找 系统设计题 LeetCode 常见题目标签 其他 题解(剑指 Offer) 模板 题目:**剑指 Offer 29. 顺时针打印矩阵** 题目描述:输入一个矩阵,...

Global site tag (gtag.js) - Google Analytics