查找算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找算法相关的知识,希望对你有一定的参考价值。

查找算法是典型的常用算法,查找算法对综合效率要求比较高,常用的查找算法有很多种,本文主要介绍顺序查找和折半查找(二分查找),更多的查找算法还请小伙伴们自行研究。

头文件:

/***************************************************************************************************** 
 *Copyright:Yue Workstation 
 * 
 *FileName:Seek.h 
 * 
 *Function:查找相关数据定义和函数声明 
 * 
 *Author:Abel Lee 
 * 
 *CreateOn:2012-2-9 
 * 
 *Log:2012-2-9 由Abel Lee创建 
 *****************************************************************************************************/ 

#ifndef SEEK_H 
#define SEEK_H 

#include "global.h" 

typedef struct SeekNode 
{ 
    ElemType *elem; 
    int length; 
}SSTable; 

int CreateTable(SSTable *ST, int n); 
void PrintTable(SSTable ST); 
int SequentialSearch(SSTable ST,ElemType key); 
void DestroyTable(SSTable *ST); 
int SearchBin(SSTable ST, ElemType key); 

#endif

源文件:

/***************************************************************************************************** 
 *Copyright:Yue Workstation 
 * 
 *FileName:Queue.c 
 * 
 *Function:排序基本算法 
 * 
 *Author:Abel Lee 
 * 
 *CreateOn:2012-2-9 
 * 
 *Log:2011-2-9 由Abel Lee创建 
 *****************************************************************************************************/ 

#include "../inc/Seek.h" 

/**************************************************************************************************** 
 *Function Name: CreateTable 
 * 
 *Function: 创建一个表 
 * 
 *Parameter:   ST:表头指针 
 *             n:表长度 
 * 
 *Return Value:成功返回0,失败返回-1 
 * 
 *Author:Abel Lee 
 * 
 *Log:2011-2-9 
 ***************************************************************************************************/ 
int CreateTable(SSTable *ST, int n) 
{ 
    int i = 0; 

    printf("Creating...
"); 
    if(ST == NULL) 
    { 
        perror("ST is NULL!"); 
        return -1; 
    } 

    ST->elem = (ElemType *)malloc(n+1); 

    for(i = 1; i <= n; i++) 
    { 
        ST->elem[i] = i; 
    } 
    ST->elem[0] = 0; 
    ST->length = n; 

    printf("Create SSTable Success!
"); 
    return 0; 
} 

/**************************************************************************************************** 
 *Function Name: PrintTable 
 * 
 *Function: 打印一个表中的内容 
 * 
 *Parameter:   ST:表头指针 
 * 
 *Return Value:无 
 * 
 *Author:Abel Lee 
 * 
 *Log:2011-2-9 
 ***************************************************************************************************/ 
void PrintTable(SSTable ST) 
{ 
    int i = 0; 

    for(i = 1; i <= ST.length; i++) 
    { 
        printf("%d-->",ST.elem[i]); 
    } 

    return; 
} 

/**************************************************************************************************** 
 *Function Name: DestroyTable 
 * 
 *Function: 销毁一个表 
 * 
 *Parameter:   ST:表头指针 
 * 
 *Return Value:无 
 * 
 *Author:Abel Lee 
 * 
 *Log:2011-2-9 
 ***************************************************************************************************/ 
void DestroyTable(SSTable *ST) 
{ 
    return ; 
} 

/**************************************************************************************************** 
 *Function Name:SequentialSearch 
 * 
 *Function:顺序查表法 
 * 
 *Parameter:   ST:查找对象 
 *             key:关键字 
 * 
 *Return Value:成功返回0,失败返回-1 
 * 
 *Author:Abel Lee 
 * 
 *Log:2011-2-9 
 ***************************************************************************************************/ 
int SequentialSearch(SSTable ST,ElemType key) 
{ 
    int i = 0; 

    for(i = 1; i < ST.length; i++) 
    { 
        if(ST.elem[i] == key) 
        { 
            return i; 
        } 
    } 
    return 0; 
} 

/**************************************************************************************************** 
 *Function Name:SequentialSearch 
 * 
 *Function: 折半查表法,针对于有序表 
 * 
 *Parameter:   ST:查找对象 
 *             key:关键字 
 * 
 *Return Value:成功返回0,失败返回-1 
 * 
 *Author:Abel Lee 
 * 
 *Log:2011-2-9 
 ***************************************************************************************************/ 
int SearchBin(SSTable ST, ElemType key) 
{ 
    int low = 1; 
    int high = ST.length; 
    int mid = 0; 

    while(low <= high) 
    { 
        mid = (low + high)/2; 
        if(key == ST.elem[mid]) 
        { 
            return mid; 
        } 
        else if(key < ST.elem[mid]) 
        { 
            high = mid - 1; 
        } 
        else 
        { 
            low = mid + 1; 
        } 
    } 

    return 0; 
}

以上是关于查找算法的主要内容,如果未能解决你的问题,请参考以下文章

以下代码片段的算法复杂度

有人可以解释啥是 SVN 平分算法吗?理论上和通过代码片段[重复]

片段(Java) | 机试题+算法思路+考点+代码解析 2023

二叉查找树简单实现

Matlab:在一帧音频数据中查找主要频率

kmp算法的个人理解