因为是排序数组,所以也用二分查找法。
分别找出第一个和最后一个k出现的位置,然后就可求出出现次数。
#include "stdafx.h"
#include<iostream>
using namespace std;
int GetFirstK(int arr[],int length,int k,int first,int last)//查找第一个k开始的地方
{
int mid = (first + last)/2;
if(first > last)
return -1;
if(arr[mid] == k)
{
if((mid > 0 && arr[mid-1] != k) || mid == 0)
{
return mid;
}
else
last = mid - 1;
}
else if(arr[mid] > k)
last = mid - 1;
else
first = mid + 1;
return GetFirstK(arr,length,k,first,last);
}
int GetLastK(int arr[],int length,int k,int first,int last)//查找第二个k结束的地方
{
int mid = (first + last)/2;
if(first > last)
return -1;
if(arr[mid] == k)
{
if((mid <length - 1 && arr[mid+1] != k) || mid == length - 1)
{
return mid;
}
else
first = mid + 1;
}
else if(arr[mid] < k)
first = mid + 1;
else
last = mid - 1;
return GetLastK(arr,length,k,first,last);
}
int main()
{
int arr[100] = {0};
int n = 0 ,i = 0;
int key = 0;
cout << "输入数字个数:"<< endl;
cin >> n ;
int len = n;
cout <<"输入要查找的关键字:" << endl;
cin >> key;
cout <<"输入数组:" << endl;
while(n--)
{
cin >> arr[i];
i++;
}
int length = GetLastK(arr,len,key,0,len ) - GetFirstK(arr,len,key,0,len)+1;
cout << length << endl;
system("pause");
return 0;
}