C语言之三大查找算法
2013-06-22 13:26
507 查看
查找算法
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语言描述)
- C语言实现三种有序表查找算法
- 依旧摘自《数据结构--用C语言描述》的查找算法 哈希和折半
- C语言三大结构的反汇编学习
- 详解C语言 三大循环 四大跳转 和判断语句
- 十.用C语言实现查找算法 (1)顺序查找;(2)二分查找(折半查找);(3)二叉排序树;(4)哈希查找
- C语言中三大经典的排序算法
- C语言编程(练习6:循环,三大循环结构 )
- C语言中的三大循环
- 三大查找算法总结:二分查找,分块查找和哈希表查找。
- 第11节 C语言三大结构之顺序结构与选择结构
- C语言三大结构
- C语言实现哈希表查找算法
- 七大查找算法(附C语言代码实现)
- c语言 三大循环 四大跳转 和判断语句
- C语言编程(练习7:循环,三大循环结构 )
- 第12节 C语言三大结构之循环结构
- C语言编程(练习1:循环,三大循环结构 )
- C语言的流程控制(第二篇章:三大循环)
- 七大查找算法(附C语言代码实现)