查找

来源:互联网 发布:莲子 知乎 编辑:程序博客网 时间:2024/04/30 21:24

查找,也称为检索,是计算机操作中最普通最费时的操作之一。所谓查找,就是根据给定的值(target),在一个表中查找出等于target的数据元素,若表中有这样的元素,则称查找是成功的,并指出该元素在表中的位置;若表中不存在这样的元素,则称查找是不成功的,或称查找失败,并且给出相应的提示。

在日常生活中,有许许多多查找的实例。如在通讯录中查找某人的地址、电话号码;在书目中查找《数据结构》书等。

本章的主要内容包括:

(1)      线性表的查找List searching

包括两个基本算法,顺序查找Sequential search(包括三种有趣的变异)和二分查找Binary search

2)哈希(散列)查找

Hashed list searching—根据数据关键字通过一个算法(哈希函数)计算出所查找数据在表中的位置。

包括哈希函数和处理冲突的方法。

虽然本章讨论的查找算法是在数组结构下进行的,但同样也适用于链表结构。实际上,顺序查找和有序表的顺序查找也是链表中查找数据最通用的方法。二分查找树则是达到二分查找效率的树的结构。这些将在相应的章节中讨论。

注:

关键字(key)查找通常是按关键字进行的,所谓关键字(key)是数据元素(或记录)中某个数据项的值,用它可以标识(或识别)一个数据元素。例如,一个学生的信息,可以包含:学号、姓名、性别、年龄、家庭住址、电话号码等,都可以作为关键字。在这些关键字中,有些可以唯一标识一个数据元素,而有些则不能唯一标识一个数据元素。如学生信息中,姓名不能唯一标识一个数据元素(因有同名同姓的人),而学号可以唯一标识一个数据元素(每个学生学号是唯一的,不能相同)。我们将能唯一标识一个数据元素的关键字称为主关键字,而其它关键字称为辅助关键字或从关键字。

代码

#include <stdio.h>
#include <stdlib.h>
#define MAX_KEY 100;

int search1(int k[],int n,int key)
{
  int i;
  k[n]=key;
  for (i=0;key!=k[i];i++)
    return i<n?i:-1;   
}   

int search2(int k[],int n,int key)
{
  int i;
  k[n]=MAX_KEY;
  for (i=0;key>k[i];i++);
  if (i<n&&k[i]==key) return i;
  return -1;  
}   

int bin_search(int k[],int n,int key)
{
  int low=0,high=n-1,mid;
  while (low<=high) {
    mid=(low+high)/2;
    if (key==k[mid])  return mid;
    if (key>k[mid]) low=mid+1;
    else high=mid-1;   
  }        
  return -1;
}   

int ins_search(int k[],int n,int key)
{
  int low=0,high=n-1,pos;
  while (low<=high)  {
    pos=(key-k[low])/(k[high]-k[low])*(high-low)+low;
    if (key==k[pos]) return pos;
    if (key>k[pos]) low=pos+1;
    else high=pos-1;       
  }        
  return -1;
}   

int main(int argc, char *argv[])
{
  int a[]={3,4,7,20,45,78,90},i;
  i= bin_search(a,7,45);
  printf("The n is %d/n",i);
 
  system("PAUSE"); 
  return 0;
}