排序数组内的查找——二分查找
来源:互联网 发布:淘宝电器商城首页 编辑:程序博客网 时间:2024/06/05 22:00
在一个有序的数组内查找一个元素,大家应该都会想到二分查找。那么,这样实现一个二分查找需要考虑哪些问题呢?
问题描述:
在一个整型有序的数组里面查找一个元素,如果这个元素出现多次,那么请返回它第一次出现的位置,否则返回-1.
解答:
首先,这是一个有序的数组,那么它的排列究竟是升序还是降序,这是第一个需要考虑到的问题;然后查找到这个元素之后还需要考虑这是不是它第一次出现,因此需要向前依次索引找出最靠前的位置。
C代码:
#include <stdio.h>#include <stdlib.h>int bin_search(int arr[], int n, int val){int left = 0;int right = n - 1;int record = 0;int middle = 0;if(n<=0 || arr == NULL){return -1;}//升序排列if(arr[left] < arr[right]){if((val < arr[left]) || (arr[right] < val))return -1;while(left <= right){middle = (left+right)>>1;if(arr[middle] > val){right = middle - 1;}if(arr[middle] < val){left = middle + 1;}else{record = middle;left = 0;right = middle - 1;//break;}}}//降序排列else{if((val > arr[left]) || (arr[right] > val))return -1;while(left <= right){middle = (left+right)>>1;if(arr[middle] < val){right = middle - 1;}if(arr[middle] > val){left = middle + 1;}else{record = middle;left = 0;right = middle - 1;//break;}}}if(arr[record] == val){return record;}return -1;}int main(){//int arr[] = {6,5,4,3,2,2,1};int arr[] = {1,2,3,3,4,6,7,8};int n = sizeof(arr)/sizeof(arr[0]);int ret = bin_search(arr, n, 5);system("pause");return 0;}
本来也可以采用在最后利用for循环语句从最左端往标记的地方遍历一遍,查找看有没有在前面出现的这个元素,但我觉得这样可能就违背了二分查找的原则,因此在不考虑时间复杂度的情况下,可以采用这个方法。
0 0
- 排序数组内的查找——二分查找
- 二维数组内的二分查找<转载>
- LeetCode基础-查找-排序数组二分查找
- JAVA数组排序——二分(折半)查找
- shell数组排序、二分查找
- 数组排序、求最值、二分查找
- 二分查找已排序数组
- 二分查找——数字在排序数组中出现的次数
- 数组的线性查找和二分查找
- 查找旋转数组的最小值-- 二分查找
- hiho1128 非有序数组的二分查找 (快速排序)
- 【leetcode】有重复的旋转排序数组查找(二分)
- 查找——二分查找
- 二分查找——旋转数组的最小数字
- 【排序】冒泡排序法and针对数组的普通查找法和二分查找法
- 【排序】冒泡排序法and针对数组的普通查找法和二分查找法
- 数组——二分查找法
- 旋转数组的二分查找
- 基于jquery封装的一个slider插件
- MFC窗口自动缩放
- springmvc知识四------数据转换&数据格式化&数据校验
- 字符串反转方法
- 2016北京PHP39期 ThinkPHP Discuz Dedecms 微信开发视频教程
- 排序数组内的查找——二分查找
- jquery获取c:foreach出来的onclick事件
- 顺序表应用4:元素位置互换之逆置算法
- LeetCode之Reverse String
- [07]javascript函数
- 网络爬虫之lxml
- ios上传appStore所需各种图片尺寸
- Qt UDP聊天软件
- 如何隐藏IP地址