查找-二分查找(3种实现版本)
2016-04-12 18:07
323 查看
二分查找(3种实现版本)
二分查找,又称为折半查找, 一次砍一半的思想,这里概念就不多说了,直接上代码吧。
1.数组版本
2.指针版本
3.数组递归版本
4.main来测试一下排序字符串
欢迎指正
二分查找,又称为折半查找, 一次砍一半的思想,这里概念就不多说了,直接上代码吧。
1.数组版本
//二分查找数组实现,速度没有指针快 char* binary_search_str_1(char* cmd[], int n, char* key_str) { int low = 0; int high = n; int mid = 0; int res = 0; while (low < high) { //mid = low + (high - low) / 2; mid = (high + low) >> 1;//移位效率高 res = strcmp(cmd[mid], key_str);//比较结果 if (res < 0) { low = mid + 1;//不对称边界,低位加1 } if (res > 0) { high = mid;//不对称边界,高位不加1 } if (0 == res) { return cmd[mid]; } } return NULL; }
2.指针版本
//二分查找指针实现,速度快 char* binary_search_str_2(char* cmd[], int n, char* key_str) { char** low = cmd; char** high = cmd + n; char** mid = NULL; int res = 0; while (low < high) { mid = low + ((high - low) >> 1);//指针没有加法 res = strcmp(*mid, key_str);//比较结果 if (res < 0) { low = mid + 1; } if (res > 0) { high = mid; } if (0 == res) { return *mid; } } return NULL; }
3.数组递归版本
//数组递归实现二分查找 char* binary_search_str_3(char* cmd[], int n, char* key_str) { static int low = 0; static int high = 10;//数组长度 static int mid = 0; if (low >= high)//结束条件 { return NULL; } else { mid = (high + low) >> 1;//移位效率高 int res = strcmp(cmd[mid], key_str);//比较结果 if (res < 0) { low = mid + 1;//不对称边界,低位加1 return binary_search_str_3(cmd, n, key_str); } if (res > 0) { high = mid;//不对称边界,高位不加1 return binary_search_str_3(cmd, n, key_str); } if (0 == res)//相等直接返回 { return cmd[mid]; } } }
4.main来测试一下排序字符串
int main(void) { //我们加大难度,来对字符串排序 char *cmd[10] = { "calc", "1234", "abcd", "ak47", "AMP", "M16", "notepad", "tasklist", "run", "mspaint" }; //数组实现 putchar('\n'); puts(binary_search_str_1(cmd, 10, "tasklist")); //指针实现 putchar('\n'); puts(binary_search_str_2(cmd, 10, "notepad")); //数组递归实现 putchar('\n'); puts(binary_search_str_3(cmd, 10, "1234")); system("pause"); return 0; }
欢迎指正
相关文章推荐
- Android 带清除功能的输入框控件ClearEditTex
- Java读取配置(.properties)文件的方法
- HDU-1878-欧拉回路
- Google Code Jam 2016 资格赛
- 循环中变量定义问题
- 接口与抽象类
- 自己写的内存分配算法
- Leetcode_171_Excel Sheet Column Number
- Tyvj_P1006
- [IOS]Protocol协议及委托代理(Delegate)传值-用代码寻找storyboard相应视图
- 网络子系统在链路层的收发过程剖析(一)【转】
- Nexus Repository Manager OSS 代理 p2 源
- 课堂练习(返回一个环状一维整数数组中最大子数组的和)
- Linux内核读书笔记第六周
- 票据OCR前预处理 (附Demo)
- Android 之历史搜索Demo
- 彻底学会使用epoll(六)——关于ET的若干问题总结
- 基于Python的卷积神经网络和特征提取
- OpenCascade中网格的数据结构
- clob变量值无法使用v$sql_bind_capture获得