统计数字在排序数组中出现的次数

来源:互联网 发布:淘宝的信用评价体系 编辑:程序博客网 时间:2024/05/07 14:36

题目:统计一个数字在排序数组中出现的次数。

分析:利用二分查找分别找到第一次出现该数的位置和最后一次出现该数的位置。

#include <stdio.h>int get_first(int a[], int len, int k, int start, int end){if(start > end)//如果没有找到所找数字,返回-1return -1;int mid = (start+end)/2;if(a[mid]==k)//中间的值等于k{if((mid>0 && a[mid-1]!=k) || mid==0)//如果中间的值前面一个值不等于k或者mid=0,那么就找到第一个kreturn mid;elseend = mid - 1;//否则在前半部分找}else if(a[mid] > k)//如果中间值大于k,则在前半部分找end = mid - 1;elsestart = mid + 1;//如果中间值小于k,则在后半部分找return get_first(a,len,k,start,end);}int get_last(int a[], int len, int k, int start, int end){if(start > end)//如果没有找到所找数字,返回-1return -1;int mid = (start+end)/2;if(a[mid]==k)//中间的值等于k{if((mid<len-1 && a[mid+1]!=k) || mid==len-1)//如果中间的值后面一个值不等于k或者mid=len-1,那么就找到最后一个kreturn mid;elsestart = mid + 1;//否则在后半部分找}else if(a[mid] > k)//如果中间值大于k,则在前半部分找end = mid - 1;elsestart = mid + 1;//如果中间值小于k,则在后半部分找return get_last(a,len,k,start,end);}int get_count(int a[], int len, int k){if(a==NULL || len<=0)return -1;int count = 0;int first = get_first(a,len,k,0,len-1);//利用二分查找,找到第一个k出现的位置int last = get_last(a,len,k,0,len-1);//利用二分查找,找到最后一个k出现的位置if(first>-1 && last>-1)count = last - first + 1;//出现的次数就是first,last之间的差值return count;}int main(){int a[] = {1,2,3,3,3,3,4,5};int len = sizeof(a)/sizeof(int);int i,count,num;printf("数组值为:\n");for(i=0;i<len;i++)printf("%d\t",a[i]);printf("\n");printf("输入需要查询的数字:\n");scanf("%d",&num);count = get_count(a,len,num);printf("该数字出现的次数为:%d\n",count);return 0;}