常见的查找算法

本文介绍了四种常见的查找算法:顺序查找、二分查找、索引查找和二叉排序树。二分查找适用于有序列表,时间复杂度为O(LogN);索引查找结合了顺序查找和二分查找,平均查找长度为O(√n);二叉排序树是一种提高查找效率的数据结构,平均查找长度与logn等量级;哈希查找通过哈希函数直接定位,冲突处理方法包括开放定址法、再哈希法等。

1)顺序查找

/*包含头文件*/
#include <stdio.h>
#include <stdlib.h>   
#include <io.h>
#include <math.h>
#include <time.h>

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20
typedef int Status; 
typedef struct
{
    int data[MAXSIZE];
    int length;    
}SeqList;
/*顺序查找算法*/
int SequenceSearch(SeqList *seqList,int key)
{
    int i;
    //遍历顺序表
    for (i=0;i<seqList->length;i++)
    {
        //找到该元素
        if (seqList->data[i]==key) return i;
    }
    //没有找到
    return -1;
}
/*打印结果*/
void Display(SeqList *seqList)
{
    int i;
    printf("\n**********展示结果**********\n");

    for (i=0;i<seqList->length;i++)
    {
        printf("%d ",seqList->data[i]);
    }
    printf("\n**********展示完毕**********\n");
}
#define N 9
void main()
{
    int i,j;
    SeqList seqList;

    //定义数组和初始化SeqList
    int d[N]={
  
  50,10,90,30,70,40,80,60,20};

    for (i=0;i<N;i++)
    {
        seqList.data[i]=d[i];
    }
    seqList.length=N;

    printf("***************顺序查找***************\n");
    Display(&seqList);
    j=SequenceSearch(&seqList,70);
    if (j!=-1) printf("70在列表中的位置是:%d\n",j);
    else printf("对不起,没有找到该元素!");

    getchar();
}

2)二分查找
二分查找也属于顺序表查找范围,二分查找也称为折半查找。二分查找(有序)的时间复杂度为O(LogN)。
1.待查找的列表必须有序。
2.必须使用线性表的顺序存储结构来存储数据。

/*包含头文件*/
#include <stdio.h>
#include <stdlib.h>   
#include <io.h>
#include <math.h>
#include <time.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20
typedef int Status; 
typedef struct
{
    int data[MAXSIZE];
    int length;    
}SeqList;
/*二分查找算法(折半查找)*/
int BinarySearch(SeqList *seqList,int key)
{
    /*下限*/
    int low=0;
    /*上限*/
    int high=seqList->length-1;
    while(low<=high) /*注意下限可以与上限重合的*/
    {
        int middle=(low+high)/2;
        /*判断中间记录是否与给定值相等*/
        if (seqList->data[middle]==key)
        {
            return middle;
        }
        else
        {
            /*缩小上限
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值