`
sunxboy
  • 浏览: 2827424 次
  • 性别: 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. }   
分享到:
评论

相关推荐

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

    顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现)

    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...

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

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

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

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

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

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

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

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

    C语言通用范例开发金典.part2.rar

    范例1-94 顺序表的查找 273 ∷相关函数:Search_Seq函数 1.6.2 静态树表的查找 276 范例1-95 静态树表的查找 276 ∷相关函数:Search_SOSTree函数 1.6.3 二叉排序树的基本操作 280 范例1-96 二叉排序树的基本...

    C语言通用范例开发金典.part1.rar

    范例1-94 顺序表的查找 273 ∷相关函数:Search_Seq函数 1.6.2 静态树表的查找 276 范例1-95 静态树表的查找 276 ∷相关函数:Search_SOSTree函数 1.6.3 二叉排序树的基本操作 280 范例1-96 二叉排序树的基本...

    C 开发金典

    范例1-94 顺序表的查找 273 ∷相关函数:Search_Seq函数 1.6.2 静态树表的查找 276 范例1-95 静态树表的查找 276 ∷相关函数:Search_SOSTree函数 1.6.3 二叉排序树的基本操作 280 范例1-96 二叉排序树的基本...

    C++和面向对象数值计算

    4.1.5 名称查找 4.2 包含文件 4.2.1 包含标准库文件 4.2.2 用户自定义头文 4.2.3 条件包含指令 4.2.4 文件包含 4.3 源文件和连接 4.3.1 独立编译 4.3.2 外部连接和内部连接 4.3.3 与其他...

    易语言程序免安装版下载

     为实现静态编译,易语言编译器、核心支持库、集成开发环境(IDE)等均有重大更新,支持库开发架框有扩展性调整,绝大多数官方支持库都已针对静态编译完成自身改造并提供静态库。  目前绝大多数官方支持库均已支持...

Global site tag (gtag.js) - Google Analytics