查找算法

1.二分查找

二分查找就是折半查找,其基本思想是:首先选取表中间位置的记录,将其关键字与给定关键字key进行比较,若相等,则查找成功。若key值比该关键字值大,则要找的元素一定在右子表中,则继续对右子表进行折半查找;若key值比该关键字值小,则要找的元素一定在左子表中,则继续对左子表进行折半查找。依次类推,直到查找成功或者查找失败。

源代码如下:

#include<stdio.h>
void binary_search(int a[],int key,int n);
int main(void)
{
int i,n,m,a[16];
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
binary_search(a,m,n);
return 0;
}
void binary_search(int a[],int key,int n)
{
int low=0;
int high=n-1;
int mid,count=0,count1;
while(low<high)
{
count++;
mid=(low+high)/2;                       //二分查找
if(key>a[mid])
low=mid+1;
if(key<a[mid])
high=mid-1;
if(key==a[mid])
{
printf("Find it and location is %d\n",mid);
count1++;                         //标记查找成功
break;                               //退出循环
}
}
if(count1==0)
printf("error\n");
}

效果图:

2.分块查找

分块查找也称为索引顺序查找,要求将待查的元素均匀地分成块,块间按大小排序,块内不排序,所以要建立一个块的最大关键字表,成为索引表。
下面是将15个数按关键字大小分成了3块,这15个数的排列是一个有序序列。也可以是无序的,但必须满足分在第一块中的任意数都小于第二块中的所有数。先顺序查找已在已建好的索引表中查出key所在的块中,再在块中顺序查找key。

源代码如下:

#include<stdio.h>
int block_search(int,int a[]);
struct index                               //定义结构体
{
int key;
int start;
int end;
}index_table[3];
int main(void)
{
int i,j=0,a[16],n;
for(i=1;i<16;i++)                     //以用户的视觉给出位置数目
scanf("%d",&a[i]);
scanf("%d",&n);
for(i=0;i<3;i++)                       //设置每块的起止位置以及关键值
{
index_table[i].start=j+1; 
j++;
index_table[i].end=j+4;
j+=4;
index_table[i].key=a[j];
}
if(block_search(n,a))
printf("Find it and location is %d\n",block_search(n,a));
else
printf("error!\n");
}
int block_search(int value,int a[])
{
int i=0,j;
while(i<3&&value>index_table[i].key)                  //确定查找值所在块
i++;
if(i<3)
{
j=index_table[i].start;
while(j<index_table[i].end&&value!=a[j])            //顺序查找值
j++;
if(j<=index_table[i].end)
return j;
else
return 0;
}
else
return 0;
}

效果图:

3.哈希查找

给定哈希表长度为11,哈希函数为H(key)=key%11,随机产生待散列的小于50的8个元素,同时采用线性探测再散列的方法处理冲突。

源代码如下:

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define Max 11
#define N 8
int hashtable[Max];
int search(int);
void creathash(int);
int func(int);
int main(void)
{
int flag[50],i,j,t;
for(i=0;i<50;i++)
flag[i]=0;                                   //50以内所有数为产生时,均标志为0
for(i=0;i<Max;i++)
hashtable[i]=-1;                         //哈希表中,初始位置全置为-1
srand((unsigned long)time(0));    //用0调用时间函数time(),将其返回值强制转换为unsigned型,作为参数来调用srand( )函数。srand( )是为rand( )函数初始化随机发生器的启动状态,以产生伪随机数,所以常把srand( )称为种子函数。用time()返回的时间值做种子的原因是time()返回的是实时时间值,每时毎刻都在变化,这样产生的伪随机数就有以假乱真的效果。
i=0;
while(i!=N)                          //产生八个数
{
t=rand()%50;                      //产生一个随机数赋予t
if(flag[t]==0)                       //看是否产生过t

creathash(t);                       //创建哈希表
printf("%d",t);
for(j=0;j<Max;j++)
printf("(%2d)",hashtable[j]);
printf("\n");
flag[t]=1;
i++;
}
}
scanf("%d",&t);                   //输入要查找的元素
if(t>=0&&t<50) 
{
i=search(t); 
if(i)
printf("Find it and location is %d\n",i);
else
printf("Not find it\n");
}
else
printf("error\n");
return 0;
}
void creathash(int key)
{
int pos,t;
pos=func(key);                           //哈希函数确定元素的位置
t=pos;
while(hashtable[t]!=-1)               //如果该位置有元素存在,则进行线性探测再散列
{
t=(t+1)%Max;
if(t==pos)                                //哈希表满的情况
{
printf("table is full");
return ;
}
}
hashtable[t]=key;                     //将元素放入确定的位置
}
int func(int value)
{
return value%Max;                      //哈希函数
}
int search(int value)
{
int pos,t;
pos=func(value);
t=pos;
while(hashtable[t]!=value&&hashtable[t]!=-1)          //如果该位置不等于要查找的关键字且不为空
{
t=(t+1)%Max;
if(pos==t)                                    //多次探测返回原来哈希函数求出的位置,说明要查找的数不存在
return 0;
}
if(hashtable[t]!=-1)
return t;
else
return 0;
}

效果图:

C语言之三大查找算法的更多相关文章

  1. 三大查找算法(Java实现)

    三大查找算法 1.二分查找(Binary Search) public class BinarySearch { public static void main(String[] args) { in ...

  2. C语言实现常用查找算法——二分查找

    #include<stdio.h> void insert_sort(int a[],int n); int binary_search(int a[],int x,int n); voi ...

  3. 七大查找算法(附C语言代码实现)

    来自:Poll的笔记 - 博客园 链接:http://www.cnblogs.com/maybe2030/p/4715035.html 阅读目录 1.顺序查找 2.二分查找 3.插值查找 4.斐波那契 ...

  4. C语言查找算法之顺序查找、二分查找(折半查找)

    C语言查找算法之顺序查找.二分查找(折半查找),最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 顺序查找 /*顺序查找 顺序查找是在一个已知无(或有序)序队列中找出与给定关键字相同的 ...

  5. 《算法C语言实现》————快速-查找算法(quick-find algorithm)

    算法基础是一个整型数组,当且仅当第p个元素和第q个元素相等时,p和q时连通的.初始时,数组中的第i个元素的值为i,0<=i<N,为实现p与q的合并操作,我们遍历数组,把所有名为p的元素值改 ...

  6. python实现折半查找算法&&归并排序算法

    今天依旧是学算法,前几天在搞bbs项目,界面也很丑,评论功能好像也有BUG.现在不搞了,得学下算法和数据结构,笔试过不了,连面试的机会都没有…… 今天学了折半查找算法,折半查找是蛮简单的,但是归并排序 ...

  7. python中两种方法实现二分法查找,细致分析二分法查找算法

    之前分析了好多排序算法,可难理解了呢!!(泣不成声)这次我要把二分查找总结一下,这个算法不算难度特别大,欢迎大家参考借鉴我不喜欢太官方的定义,太晦涩的语言,让人看了就头晕.我希望加入我自己的理解,能帮 ...

  8. 大数据技术之_16_Scala学习_13_Scala语言的数据结构和算法_Scala学习之旅收官之作

    第十九章 Scala语言的数据结构和算法19.1 数据结构(算法)的介绍19.2 看几个实际编程中遇到的问题19.2.1 一个五子棋程序19.2.2 约瑟夫问题(丢手帕问题)19.2.3 其它常见算法 ...

  9. 【摩天大楼平地起】基础篇 09 简述N种查找算法

    引言 在开始之前首先可以先思考一下假如没有查找算法会是什么情况?所有数据结构都需要全部遍历一遍,每次都一遍又一遍的查,从本质而言查找算法就是为了提高效率. 经过前人一代又一代的努力,目前的查找算法大致 ...

随机推荐

  1. cocos2dx tag和zorder

    当一个渲染对象加入到两外一个渲染对象中时,可以有两个可选参数,一个时tag,一个是order virtual void addChild(CCNode * child); virtual void a ...

  2. LRU算法的设计

    一道LeetCode OJ上的题目,要求设计一个LRU(Least Recently Used)算法,题目描述如下: Design and implement a data structure for ...

  3. 化简复杂逻辑,编写紧凑的if条件语句(二):依据if子句顺序化简条件

    <化简复杂逻辑,编写紧凑的if条件语句>已经得出了跳.等.飞.异常的各自条件,方便起见这里重新贴一下. 立即跃迁:!a && b && d 等待跃迁:!a ...

  4. uva 10763 Foreign Exchange(排序比较)

    题目连接:10763 Foreign Exchange 题目大意:给出交换学生的原先国家和所去的国家,交换成功的条件是如果A国给B国一个学生,对应的B国也必须给A国一个学生,否则就是交换失败. 解题思 ...

  5. 理解Android的layout和measure

    在Android UI开发中,总会有情况需要自定义View和View Group. 什么是View?就是Android中一个基本视图单位,一个Button是一个view, 一个Layout, 也是一个 ...

  6. Linux进程间通信总结

    刚请完婚假,请假期间做了些技术总结,其中一个就是Linux进程间通信方式的总结. Linux提供了多种进程间通信的方式,列举如下: PIPE(管道) FIFO(先进先出,也称为有名管道) domain ...

  7. xcode initWithCoder\awakeFromNib\layoutSubviews

    控件通过xib,storyboard创建,初始化设置一定会调用initWithCoder awakeFromNib 加载完毕的时候肯定会调用 layoutSubviews 布局子控件 位置和尺寸 利用 ...

  8. 2.一步一步学c#(二):核心c#

    简单的控制台应用程序. 代码(它有把某条消息写到屏幕上的一个类组成) 编译并运行程序得到结果: 在上面的代码示例中,前几行代码与名称空间有关,名称空间是把相关类组合在一起的方式.namespace关键 ...

  9. C part 1 -- 指令篇

    Windows系统的cmd(command命令行工具): Shutdown -s -t 600:表示600秒后自动关机 Shutdown -a :可取消定时关机 Shutdown -r -t 600: ...

  10. PHP获取网址的PR值

    PR值是google衡量网站的重要标准之一,根据google提供的结果获取pr值,如:http://toolbarqueries.google.com.hk/tbr?client=navclient- ...