C语言实现:折半查找(二分查找)
来源:互联网 发布:淘宝零食高颜值知乎 编辑:程序博客网 时间:2024/06/06 02:35
循环实现折半查找
直接查找,使用了while循环和if语句
#include <stdio.h>#include <stdlib.h>int main(){ int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, }; int key = 9; int left = 0; int right = sizeof(arr) / sizeof(arr[0]) - 1;//right是数组最后一个元素 while (left <= right)//如果没有'left=right',那就会把'left=right'时所对应的元素遗漏掉 { int mid = left + (right - left) / 2;//注意溢出 /*先比较'==',这样的话,可少判断来两次(分别是if(key > arr[mid])和if(key < arr[mid]))*/ if (key == arr[mid]) { printf("找到了,数组下标为: %d\n", mid); break; } else { if (key > arr[mid]) { left = mid + 1; } else { right = mid - 1;//下标mid所对应的元素,已经判断过,是左闭右闭区间,所以取mid前一个就好 } } if (left > right) { printf("找不到:\n"); } } system("pause"); return 0;}
实现折半查找时,一定要注意区间的问题,看清楚给的是左闭右闭,还是左闭右开
1.溢出问题 在求mid时,不能写为mid=(left+right)/2 而应该写为 mid=left+(right-left)/2 2.如果没找到元素,记得返回"return -1;"而不要返回" return 0 ; ",因为0是数组的第一个元素,如果写为 " return 0 ; "那就意味着找到了 3.先书写"if(data==mid)" 因为这样可以少执行两次if判断("if(data>mid)"和"if(data<mid)" ),程序效率高
1.给的区间是“左闭右闭”([1,9])
调用了binary_search()函数,使用了while循环和if语句。注意在函数调用时传过来的数组,只是数组首元素,而不是整个数组,所以再用sizeof 时一定要注意!
#include <stdio.h>#include <stdlib.h>int binary_search(int arr[], int key, int sz){ int left = 0; int right = sz -1; while (left <=right)//是左闭右闭区间,需要判断left=right时的元素 { int mid = left + (right - left)/2;//注意溢出 /*先比较'==',这样的话,可少判断来两次(分别是if(key > arr[mid])和if(key < arr[mid]))*/ if (key == arr[mid]) { return mid; } else { if (key > arr[mid]) { left = mid + 1; } else { right = mid-1;//是左闭右闭区间,mid所对应的元素已经被比较过,所以去mid前一个元素就好 } } } return -1;//如果找不到,记得返回'-1',不要返回'0'}int main(){ int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int key = 7; int sz = sizeof(arr) / sizeof(arr[0]); int ret = binary_search(arr, key, sz); if (ret == -1) { printf("找不到\n"); } else { printf("找到了,数组下标为: %d\n", ret); } system("pause"); return 0;}
运行截图:
2.给的区间是左闭右开( [1,9) )
调用了binary_search()函数,使用了while循环和if语句。注意在函数调用时传过来的数组,只是数组首元素,而不是整个数组,所以再用sizeof 时一定要注意!
#include <stdio.h>#include <stdlib.h>int binary_search(int arr[], int key, int sz){ int left = 0; int right = sz ; while (left <right)//是左闭右开区间,所以不需判断left=right时的元素 { int mid = left + (right - left)/2;//注意溢出 /*先比较'==',这样的话,可少判断来两次(分别是if(key > arr[mid])和if(key < arr[mid]))*/ if (key == arr[mid]) { return mid; } else { if (key > arr[mid]) { left = mid + 1; } else { right = mid;//是左闭右开区间,所以不需判断mid所对应的元素 } } } return -1;//如果找不到,记得返回'-1',不要返回'0'}int main(){ int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int key = 9; int sz = sizeof(arr) / sizeof(arr[0])-1;//左闭右开区间元素'9',取不到 int ret = binary_search(arr, key, sz); if (ret == -1) { printf("找不到\n"); } else { printf("找到了,数组下标为: %d\n", ret); } system("pause"); return 0;}
运行截图:
阅读全文
1 0
- C语言实现:折半查找(二分查找)
- C语言实现折半查找(二分查找)的算法
- C语言 折半查找(二分查找)
- c语言:代码实现折半(二分)查找
- c语言 二分查找 折半查找
- 二分查找(折半查找)与冒泡排序(C语言)
- C语言中二分查找(折半查找)
- Java 语言实现折半查找(二分查找)
- 【C/C++】折半查找(二分查找)
- c/c++折半查找(二分查找)
- 折半查找(二分查找)Java实现
- 二分查找(折半查找),Java实现
- 折半查找(二分查找)实现
- 实现折半查找算法(二分查找)
- JavaScript实现折半查找(二分查找)
- 十.用C语言实现查找算法 (1)顺序查找;(2)二分查找(折半查找);(3)二叉排序树;(4)哈希查找
- C语言-二分查找(折半查找)算法
- 折半查找(二分查找)
- 机器学习5:逻辑回归
- PHP 中如何使用 AJAX
- 【hdu 1069】Monkey and Banana(dp)
- U盘里格式化了怎么办?教你一招,快速找回格式化的文件!
- Java中的内部类
- C语言实现:折半查找(二分查找)
- 初学acmer--读《算法竞赛经典入门》笔记(六)p45-48
- Ubuntu 16.04 Kernel Crash Dump
- std::getenv
- 数据库之字段数据类型
- MYSQL数据库 的 decimal 字段类型 和 Java 的BigDecimal
- Java------java调用C++dll & C++判断Windows电脑锁定状态
- java 利用牛顿迭代法求平方根和立方根,不使用Math类
- 1757:神奇的口袋(2.7基本算法之算法效率)