首页 > 其他分享 >15.4折半查找原理及实战

15.4折半查找原理及实战

时间:2023-04-10 21:33:06浏览次数:36  
标签:折半 TableLen 15.4 int ElemType elem ST 查找

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

typedef int ElemType;
typedef struct {
    ElemType* elem;   //整型指针
    int TableLen;     //存储动态数组里边元素的个数
}SSTable;


//init进行了随机数生成,折半查找没有使用哨兵
void ST_Init(SSTable &ST,int len)
{
    ST.TableLen=len;
    ST.elem=(ElemType*) malloc(sizeof (ElemType)*ST.TableLen);
    int i;
    srand(time(NULL));   //随机数生成
    for (int i = 0; i < ST.TableLen; i++) {
        ST.elem[i]=rand()%100;
    }
}

//实现二分查找
int BinarySearch(SSTable L,ElemType key)
{
    int low=0;
    int high=L.TableLen-1;
    int mid;
    while (low<=high)   // low<=high,可以让mid既能取到low,也能取到high
    {
        mid=(low+high)/2;
        if(key>L.elem[mid])   //如果目标值大于中位数
        {
            low=mid+1;
        } else if(key<L.elem[mid])
        {
            high=mid-1;
        } else{
            return mid;
        }
    }
    return -1;
}


void ST_print(SSTable ST)
{
    for (int i = 0; i < ST.TableLen; i++) {
        printf("%3d",ST.elem[i]);
    }
    printf("\n");
}

//函数名中存储的是函数的入口地址,也是一个指针,是函数指针类型
//left指针和right指针是指向数组中的任意两个元素
//qsort规定如果left指针指向的值大于right指针指向的值,返回正值,小于返回负值,相等返回0
int compare(const void *left,const void *right)
{
    return *(int *)left-*(int*)right;
    //return *(ElemType*)right - *(ElemType*)left;  //从大到小排序
}
//二分查找
int main() {
    SSTable ST;
    ST_Init(ST,10);
    ST_print(ST);
    qsort(ST.elem,ST.TableLen,sizeof (ElemType),compare);   //排序
    ST_print(ST);
    ElemType key;
    printf("please input search key:\n");
    scanf("%d",&key);
    int pos= BinarySearch(ST,key);
    if(pos!=-1)
    {
        printf("find key %d\n",pos);
    } else{
        printf("not find\n");
    }
    return 0;
}

 

标签:折半,TableLen,15.4,int,ElemType,elem,ST,查找
From: https://www.cnblogs.com/su-1007/p/17304381.html

相关文章

  • 15.3顺序查找及实战
    #include<stdio.h>#include<stdlib.h>#include<time.h>typedefintElemType;typedefstruct{ElemType*elem;//整型指针,申请的堆空间的起始地址存入elemintTableLen;//存储动态数组里边元素的个数}SSTable;voidST_Init(SSTable&ST,intlen){//......
  • 用find_if查找vector内对象的成员
    用stl的find方法查找一个包含简单类型的vector中的元素是很简单的,例如vector<string>strVec;find(strVec.begin(),strVec.end(),”aa”);假如vector包含一个复合类型的对象呢比如classA{public:A(conststd::stringstr,intid){this->str=str;this->id=id;}private:......
  • mysql - 在 MySQL 空间数据库中查找相交区域
    在MySQL数据库中,如何找到完全或部分落在距另一点一定距离内的圆形区域?有很多例子可以找到某个半径内的点,但没有找到与该半径相交的圆形区域。我有一份为某些区域(点和半径)提供服务的承包商列表。客户需要能够根据与他们的距离找到这些承包商。最佳答案我认为您正在寻找......
  • LeetCode习题——x 的平方根(二分查找)
    ###x的平方根力扣链接:[x的平方根](https://leetcode.cn/problems/sqrtx/)####题目>给你一个非负整数x,计算并返回x的算术平方根。>>由于返回类型是整数,结果只保留整数部分,小数部分将被舍去。>>注意:不允许使用任何内置指数函数和算符,例如pow(x,0.5)或者x*......
  • 二分查找
    #include<iostream>usingnamespacestd;intbinaryFind(int*arr,intlen,inttarget){intleft=0;intright=len;#不要用sizeof(arr)/sizeof(arr[0])求数组长度,这样相当于求一个指针所占字节数8/4=2,引入参数lenwhile(left<=right){......
  • 18.LUT查找表
    前面介绍的阈值比较方法中只有一个阈值,如果需要与多个阈值进行比较,就需要用到显示查找表(Look-Up-Table,LUT)。LUT查找表简单来说就是一个像素灰度值的映射表,它以像素灰度值作为索引,以灰度值映射后的数值作为表中的内容。例如我们有一个长度为5的存放字符的数组,LUT查找表就是通过......
  • LeetCode习题——在排序数组中查找元素的第一个和最后一个位置(二分查找)
    在排序数组中查找元素的第一个和最后一个位置力扣链接:在排序数组中查找元素的第一个和最后一个位置题目给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1,-1]。你......
  • python中的二分查找
    二分查找的前提是查找的数据按照顺序排序二分查找的核心思想是递归#arr:查找的对象#left:arr的左边界#right:arr的右边界#x:需要查找的数defbinary_search(arr,left,right,x):#左边界小于等于右边界ifleft<=right:#得到中位数mid=int((lef......
  • [每天例题] 查找输入整数二进制中1的个数
    查找输入整个二进制中1的个数题目 题目分析计算它在二进制下的1的个数。注意多组输入输出!!!!!! 数据范围:1≤n≤2^31 −1 思路分析1.多组数据的输入方法:1.EOF法因为在线评测系统的输入数据存放在一个文件中,因此可以通过文件是否结束的方式判断输入的数据是否结束。scanf......
  • pg数据库查找外键但没有索引的sql
    SELECTpg_index.indexrelid::regclass,'createindex'||relname||'_'||array_to_string(column_name_list,'_')||'_idxon'||conrelid||'('||array_to_string(column_name_list,......