顺序查找和折半查找

233 阅读2分钟

「这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战」。

顺序查找

顺序查找的基本思想

从线性表的一端向另一端逐个将记录与给定值进行比较,若相等,则查找成功,给出该记录在表中的位置;若整个表检测完仍未找到与给定值相等的记录,则查找失败,给出失败信息

算法描述

int SeqSearch1(int r[ ], int n, int k)
{   
     int i = n;
     while (i > 0 && r[i] != k)
         i--;
     return i;
}

顺序查找的缺点:查找效率较低,特别是当待查找集合中元素较多时,不推荐使用顺序查找
顺序查找的优点:算法简单而且使用面广

  1. 对表中记录的存储没有任何要求,顺序存储和链接存储均可
  2. 对表中记录的有序性也没有要求,无论记录是否按关键码有序均可

索引顺序表

索引顺序表查找:是将顺序表分成几个单元,然后为这几个单元建立一个索引,利用索引在其中一个单元中进行查找。
通常将为顺序表提供索引的表称为索引表,索引表分为两个部分:一个用来存储顺序表中每个单元最大的关键字,另一个用来存储顺序表中每个单元第1个元素的下标。
索引表中的关键字必须是有序的,主表中的元素可以是按关键字有序排列,也可以是在单元内或块中有序,即后一个单元中所有元素的关键字都大于前一个单元中元素的关键字。
索引顺序表查找也称为分块查找,主要应用在表中存在大量的数据元素的时候,通过为顺序表建立索引和分块来提高查找的效率。

折半查找

折半查找的基本思想

在有序表(假设为递增)中,取中间记录作为比较对象,若给定值与中间记录相等,则查找成功;若给定值小于中间记录,则在有序表的左半区继续查找;若给定值大于中间记录,则在有序表的右半区继续查找。不断重复上述过程,直到查找成功,或查找区域无记录,查找失败

运行实例

image.png

非递归算法

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

递归算法

int BinSearch2(int low, int high, int k) 
{  
    if (k < data[mid]) return BinSearch2(low, mid-1, k);
    else if (k > data[mid]) return BinSearch2(mid+1, high, k); 
    else return mid;       
}