首页 > 其他分享 >二分查找

二分查找

时间:2022-12-11 14:23:33浏览次数:68  
标签:二分 TableLen int ElemType void ST 查找 printf

学习时间2022.12.11

二分查找

基本概念

知识点补充

  • qsort函数
    • 函数声明:
    void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
    
    • 参数:
      base -- 指向要排序的数组的第一个元素的指针。
      nitems -- 由 base 指向的数组中元素的个数。
      size -- 数组中每个元素的大小,以字节为单位。
      compar -- 用来比较两个元素的函数。
    • compar函数
      //a,b是任意两个数字
      int cmpfunc (const void * a, const void * b)
      {
          //从小到大
          return ( *(int*)a - *(int*)b );
          //从大到小
          //return ( *(int*)b - *(int*)a );
      }
    
    • 实例
      #include <stdio.h>
      #include <stdlib.h>
    
      int values[] = { 88, 56, 100, 2, 25 };
    
      int cmpfunc (const void * a, const void * b)
      {
          return ( *(int*)a - *(int*)b );
      }
    
      int main()
      {
          int n;
    
          printf("排序之前的列表:\n");
          for( n = 0 ; n < 5; n++ ) {
              printf("%d ", values[n]);
          }
    
          qsort(values, 5, sizeof(int), cmpfunc);
    
          printf("\n排序之后的列表:\n");
          for( n = 0 ; n < 5; n++ ) {
              printf("%d ", values[n]);
          }
          
          return(0);
      }
    

代码实现

数据结构

typedef int ElemType;

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

函数声明

  • 初始化数组
      void ST_init(SSTable &ST, int len){
          ST.TableLen = len;
          //ST.elem = (ElemType*)malloc(sizeof(ElemType) * ST.TableLen);
          ST.elem = (ElemType*)calloc(ST.TableLen, sizeof(ElemType));
          //初始化随机数发生器
          srand(time(NULL));
          //输出0-100的ST.TableLen个随机数
          for (int i = 0; i < ST.TableLen; i++)
          {
              ST.elem[i] = rand() % 100;
          }
      }
    
  • 二分查找函数
      int Binary_Search(SSTable ST, ElemType key) {
          int low = 0, high = ST.TableLen - 1, mid;
          while (low <= high)
          {
              mid = (low + high) / 2;
              if (ST.elem[mid] == key)
              {
                  return mid;
              }
              else if(ST.elem[mid] > key)
              {
                  high = mid - 1;
              }
              else
              {
                  low = mid + 1;
              }
          }
          return -1;
      }
    
  • compare函数
      //用于规定快排是从小到大还是从大到小
      int compare(const void* left, const void* right) {
          //从小到大
          return *(ElemType*)left - *(ElemType*)right;
          //从大到小
          //return *(ElemType*)right - *(ElemType*)left;
      }
    
  • 输出数组
      void ST_print(SSTable ST) {
          for (int i = 0; i < ST.TableLen; i++) {
              printf("%3d", ST.elem[i]);
          }
          printf("\n");
      }
    

main函数

int main() {
	SSTable ST;
	int pos;
	ElemType key;
	ST_init(ST, 10);
	ST_print(ST);
	//实现快排
	qsort(ST.elem, ST.TableLen, sizeof(ElemType), compare);
	ST_print(ST);
	printf("请输入需要查找的元素key值:");
	scanf("%d", &key);
	pos = Binary_Search(ST, key);
	if (pos!= -1) {
		printf("您所查找的元素%d的位置为:第%d位\n", key, pos);
	}
	else {
		printf("您所查找的元素不存在\n");
	}
}

标签:二分,TableLen,int,ElemType,void,ST,查找,printf
From: https://www.cnblogs.com/ayubene/p/16973641.html

相关文章

  • 算法总结-二分查找(两种模板方法总结)
    【二分查找】定义:二分查找也称折半查找(BinarySearch),是一种在有序数组中查找某一特定元素的搜索算法。我们可以从定义可知,运用二分搜索的前提是数组必须是有序的,这里需要......
  • 我们常用于猜数字游戏的二分查找算法怎么用python实现呢?
    原理简单介绍类比猜数游戏我们上篇文章唠了唠经典的冒泡排序算法,如果说经典算法,那怎么少得了二分查找呢.可以说它是经典中的经典,就我们常用于猜数字方法.就是他.比如猜1......
  • (转)shell命令:find查找命令
    原文:https://blog.csdn.net/xuejianbest/article/details/84988196?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-4-84......
  • 二维数组中的查找
    在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。......
  • 调用一个二分法函数查找数值的下标值
    intbinary_search(intx,intarrx[],intsz){ intleft=0; //intright=(sizeof(arrx)/sizeof(arrx[0]))-1;不能在函数里计算数组(参数)的大小 intright=sz-......
  • 算法学习笔记(3)——二分
    二分二分法用于解决这样一类问题:一个区间能分成左右两部分,左半部分满足性质\(A\),右半部分不满足性质\(A\)。问题的目标是求解这两部分的分界点。所以二分法和区间里有......
  • java从一个较大的文本文档中查找字符串
    java从一个较大的文本文档中查找字符串 publicstaticvoidfindStr(FilefileParam)throwsIOException{FileReaderfread=null;BufferedReaderbufferR......
  • SQL Server 数据库查找重复记录的几种方法
    一、查某一列(或多列)的重复值。(只可以查出重复记录的值,不能查出整个记录的信息)例如:查找id,name重复的记录:selectid,namefromdatatablegroupbyid,namehaving(count(*)......
  • 分类预测 | MATLAB实现ELM极限学习机多特征分类预测(二分类)
    OverridetheentrypointofanimageIntroducedinGitLabandGitLabRunner9.4.Readmoreaboutthe extendedconfigurationoptions.Beforeexplainingtheav......
  • 用二分法做题【通用】
    二分法通用模板题目来源:Acwing789数的范围题目描述:给定一个按照升序排列的长度为n的整数数组,以及q个查询。对于每个查询,返回一个元素k的起始位置和终止位置(位......