标签:二分查找
问题描述:如何在有序数组中给出指定数字出现的次数,例如:数组{1,2,2,2,3,4,5} 数字2的出现次数为3。
最简单的方法是遍历数组,代码如下:
#include <stdio.h> //如何在有序数组中给出指定数字出现的次数 int binarysearch(int *a,int n,int x) { int cnt=0; for(int i=0;i<n;i++) { if(a[i]==x) cnt++; } return cnt; } int main() { int a[10]={1,2,3,4,5,6,6,6,9,10}; printf("%d\n",binarysearch(a,10,6)); return 0; }
代码如下:
#include <stdio.h> //如何在有序数组中给出给定数字出现的次数 int binarysearch(int *a,int low,int high,int x) { int cnt=0; int temp; int mid=(low+high)/2; while(low<=high) { mid=(low+high)/2; if(a[mid]<x) low=mid+1; else if(a[mid]>x) high=mid-1; else { temp=mid; //程序运行到这元素x已经出现一次 cnt++; while(a[++mid]==x) cnt++; while(a[--temp]==x) cnt++; return cnt; } } //查找失败,返回0 return 0; } int main() { int a[10]={1,2,3,4,5,6,6,6,9,10}; printf("%d\n",binarysearch(a,0,10,6)); return 0; }
首先二分查找找到对应元素,如果查找失败返回0,如果查找成功,记录当前位置,往两侧判断,程序结构上虽然看起来比较复杂,如果数组规模较大,效率方面有不少提升,希望有更好方法的朋友能够不吝赐教。
标签:二分查找
原文地址:http://blog.csdn.net/persever/article/details/45741829