对数组的二分查找

  • 1 泛型函数bsearch()的编写过程
    • 1.1 先实现对整型数组的查找
    • 1.2 尝试使用泛型
    • 1.3 增加对负数和指针数组的支持
  • 2 测试
    • 2.1 对指针数组的二分查找

1 泛型函数bsearch()的编写过程

1.1 先实现对整型数组的查找

int8_t BinarySearch(int key, int *arr, uint8_t arrLen)
{uint8_t low = 0;uint8_t high = arrLen-1;uint8_t middle;// In ascending orderwhile(low <= high) {middle = (low + high)>>1;if(arr[middle] == key) {return middle;} else if (arr[middle] > key) {high = middle - 1;} else {low = middle + 1;}}return -1;
}

1.2 尝试使用泛型

/*** 问题1:遇到负数使用 memcmp 就完蛋了!!!* 问题2:无法支持指针数组**/
void *bsearch(void *key, void *arr, uint8_t arrLen, uint8_t elemSize)
{uint8_t low = 0;uint8_t high = arrLen - 1;uint8_t middle;void *elemAddr;// In ascending orderwhile(low <= high) {middle = (low + high) >> 1;elemAddr = (char *)arr + middle * elemSize;if(0 == memcmp(key, elemAddr, elemSize)) {return elemAddr;} else if(memcmp(key, elemAddr, elemSize) > 0 ) {low = middle + 1;} else {high = middle - 1;}}return NULL;
}

1.3 增加对负数和指针数组的支持

void *bsearch(void *key, void *arr, uint8_t arrLen, uint8_t elemSize, int cmpFn(void*, void*))
{uint8_t low = 0;uint8_t high = arrLen - 1;uint8_t middle;void *elemAddr;int result;// In ascending orderwhile(low <= high) {middle = (low + high) >> 1;elemAddr = (char *)arr + middle * elemSize;result = cmpFn(key, elemAddr);if(0 == result) {return elemAddr;} else if(result > 0 ) {low = middle + 1;} else {high = middle - 1;}}return NULL;
}
int bIntCmp(void *elem1, void *elem2)
{int *ip1 = (int *)elem1;int *ip2 = (int *)elem2;return *ip1 - *ip2;
}int bStrCmp(void *elem1, void *elem2)
{char *cp1 = *(char **)elem1;char *cp2 = *(char **)elem2;return strcmp(cp1, cp2);
}

2 测试

2.1 对指针数组的二分查找

int arr[] = {-100, -25, -1, 0, 1, 5, 6, 10, 11, 12, 15};
char *str[] = { // ordered list, ascending order"ab","abc","abcd","abcde"
};int main (int argc, char *argv[])
{char *strKey = "abc";void *get;printf("there are %d elems in array\r\n", sizeof(str)/sizeof(char *));get = bsearch( &strKey, &str, sizeof(str)/sizeof(char *), sizeof(char *), bStrCmp);if(NULL != get) {printf( "taget %s was founded in position %d\r\n", strKey,  (char **)get - str);} else {printf("Not founded\r\n");}return 0;
}

筑基_C_5_对数组的二分查找相关推荐

  1. leetcode练习一:数组(二分查找、双指针、滑动窗口)

    文章目录 一. 数组理论基础 二. 二分查找 2.1 解题思路 2.2 练习题 2.2.1 二分查找(题704) 2.2.2 搜索插入位置(题35) 2.2.3 查找排序数组元素起止位置(题34) 2 ...

  2. 有序升序数组的二分查找

    有序升序数组的二分查找 //有序升序数组二分查找 #include<stdio.h> #include<windows.h> //控制台显示 int BinSearch(int ...

  3. (旋转数组的)二分查找算法

    二分查找算法(Binary Search)是一种高效的.应用广泛的查找算法.它是一种采用分治策略的算法. 基本二分查找算法 二分查找是针对顺序存储的有序序列的:二分查找的基本思想是:将目标元素与序列中 ...

  4. 【C语言函数3.2】写一个函数,实现一个整形有序数组的二分查找代码

    写一个函数,实现一个整形有序数组的二分查找代码 #include <stdio.h>int binary_search(int a[], int k, int s) {int left = ...

  5. 有序数组二分查找java_详解Java数据结构和算法(有序数组和二分查找)

    一.概述 有序数组中常常用到二分查找,能提高查找的速度.今天,我们用顺序查找和二分查找实现数组的增删改查. 二.有序数组的优缺点 优点:查找速度比无序数组快多了 缺点:插入时要按排序方式把后面的数据进 ...

  6. java数组二分查找_java 13-1 数组高级二分查找

    查找: 1.基本查找:数组元素无序(从头找到尾) 2.二分查找(折半查找):数组元素有序 pS:数组的元素必须有顺序,从小到大或者从大到小.以下的分析是从小到大的数组 二分查找分析: A:先对数组进行 ...

  7. leetcode167. 两数之和 II - 输入有序数组(二分查找)

    给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值 ...

  8. vb获取数组长度_如何实现数组的二分查找

    二分查找是一种极其高效.简练的查找算法,它不仅简单,易用,而且还非常的高效.相对于顺序查找,二分查找在效率是呈现指数性提升,数据量越大,越能体现出二分查找法的优势. 二分查找的查找过程是:先确定待查找 ...

  9. Arrays对数组,二分查找,冒泡排序

    import java.util.Arrays;/*** 已知数组如下:* int[] arr = {431,54,25,25,26,45,2,4,65,3,64,6,46,7,54};* 1:使用A ...

最新文章

  1. 最前沿:大规模深度强化学习的发展
  2. Helloj2ee WPF书评系列——缘起
  3. hdu3374最小表示法+KMP
  4. [C#][Newtonsoft.Json] Newtonsoft.Json 序列化时的一些其它用法
  5. c语言程序设计第二版李学刚,C语言程序设计(第2版)李学刚教学资源教学课件2-7 动态变量.pptx...
  6. H5 的getImageData造成的大量内存开销
  7. Azkaban报错:Missing required property ‘azkaban.native.lib’
  8. 车辆撞人有全险但是是全责,车主不愿出钱垫付医药费,该怎么办?
  9. 当你写爬虫遇到APP的请求有加密参数时该怎么办?【初级篇-常规模式】
  10. 500 内部服务器错误php,如何解决php 500内部服务器错误问题
  11. [论文笔记] EMNLP2019: A Lexicon-Based Graph Neural Network for Chinese NER
  12. 自适应滤波器(E 题 本科组)--2017 年全国大学生电子设计竞赛试题
  13. 百度搜索框搜索时显示或者隐藏历史搜索记录
  14. Python环境下数据处理常用命令
  15. 深度学习21天——卷积神经网络(CNN):实现mnist手写数字识别(第1天)
  16. 查看oracle关闭重启,oracle 数据库关闭重启
  17. 电脑html动态桌面壁纸制作,电脑如何制作动态壁纸_电脑上怎么搞动态壁纸-win7之家...
  18. 单片机反相器_TTL反相器的基本电路
  19. python分析红楼梦中人物形象_红楼梦人物形象分析+赏析_作文
  20. android 实现一个开机自启动的service

热门文章

  1. Mac Outlook左侧文件夹不见了,怎么处理?
  2. 上海世博会展示未来6大生活趋势
  3. 如何找自己想要的项目?看这里告诉你答案
  4. [HTML5] Video 标签播放及控制视频
  5. java 某个类 单独输出日志_log4j实现特定功能的日志单独输出到指定的日志文件...
  6. 立象(ARGOX) 条码标签打印机通用库 PLLB(BWIN-SCAPI)
  7. 手把手教你摆脱愚蠢的有道云笔记过上Typora的好日子
  8. 华为ensp的缺省_利用华为ENSP模拟器分析和配置中小型企业网络的综合实验
  9. 那个人总有一天会爱你
  10. pythongui界面源码_超酷 Python 程序包 ,一行代码实现 GUI 界面