博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【算法】二分查找
阅读量:6548 次
发布时间:2019-06-24

本文共 2151 字,大约阅读时间需要 7 分钟。

 

最近在牛客网刷题,有一道题目是实现二分查找算法,由此便在咖啡店写了段代码,实现这个简单的算法。但同时自己还有一个问题(见最后),希望有朋友能帮忙解答。后期如果自己知道答案,我会自己更新在此。

 

一. 算法介绍

   优点:比较次数少,查找速度快,平均性能好;

   缺点:要求待查表为有序表,且插入删除困难。

   适用:不经常变动而查找频繁的有序列表。

   时间复杂度:o(log(n))

 

二. 算法代码实现(C++)   

1 // BinarySearch.cpp : Defines the entry point for the console application. 2  3 #include "stdafx.h" 4 #include 
5 6 using namespace std; 7 8 //compare function 9 int compare(const void *val1, const void *val2)10 {11 int iVal1 = *(int*)val1;12 int iVal2 = *(int*)val2;13 14 cout << "Compare: " << iVal1 << ", " << iVal2 << endl;15 16 if (iVal1 > iVal2)17 {18 return 1;19 }20 else if (iVal1 == iVal2)21 {22 return 0;23 }24 else25 {26 return -1;27 }28 }29 30 //nel: num of element, width: every element size31 void *bsearch(const void *key, const void *base, size_t nel, size_t width, int (*compar)(const void*, const void *))32 {33 int pos = nel / 2;34 35 cout << "Position: " << pos << endl;36 37 int result = (*compar)(key, (int *)base + pos);38 39 if (pos == 0)40 {41 return result == 0 ? (void *)base : NULL;42 }43 44 if (result > 0)45 {46 return bsearch(key, (int *)base + pos + 1, pos, width, compar);47 }48 else if (result == 0)49 {50 return (void *)base;51 }52 else53 {54 return bsearch(key, base, pos, width, compar);55 }56 }57 58 int _tmain(int argc, _TCHAR* argv[])59 {60 int array[] = { 1, 3, 5, 6, 11, 13, 17, 29, 44, 66, 79, 99, 111 };61 int arrayNum = sizeof(array) / sizeof(*array);62 cout << "Array Element Num: " << arrayNum << endl;63 64 int searchVal = 13;65 cout << "Search Value: " << searchVal << endl;66 67 int *result = (int *)bsearch(&searchVal, array, arrayNum, sizeof(*array), compare);68 69 cout << "Result: " << (result == NULL ? "Not Found" : "Found") << endl;70 71 system("pause");72 return 0;73 }

运行显示正确。

 

三. 问题

   这里自己有一个小问题,就是算法接口中的size_t width参数我并没有用到,同时我假设元素都是INT型。请问这里该如何修改,既能用到width,又不用假设元素为特定类型?谢谢。

 

 

Best Regards

Kevin Song

 

转载于:https://www.cnblogs.com/KevinSong/p/4188534.html

你可能感兴趣的文章
四、基于802.1x+AD+NPS+DHCP动态下发VLAN配置 (第4篇、添加角色DHCP服务器并配置)...
查看>>
linux基础命令学习之ls(1)
查看>>
巧用windows批处理,实现简易邮件群发功能
查看>>
SAMBA
查看>>
同事联系方式备份脚本编写
查看>>
gulp构建前端工程
查看>>
标题 php学习遇到的问题
查看>>
浅谈 Android 开发文化
查看>>
zabbix 4.0监控vsphere6.5
查看>>
使用 PowerShell 自动化 CloudServices 发布
查看>>
【官方文档】linux 安装花生壳
查看>>
决心书
查看>>
samba
查看>>
Android中asset文件夹和raw文件夹区别
查看>>
HBASE之RowKey排序解析
查看>>
这样去写你的 HTML.
查看>>
Express 常用中间件 body-parser 实现解析
查看>>
开源库RxJava、ButterKnife
查看>>
如何掌握多处理器编程技巧
查看>>
java中生成唯一的ID
查看>>