排序数组内的查找——二分查找

来源:互联网 发布:淘宝电器商城首页 编辑:程序博客网 时间: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
原创粉丝点击