在排序数组中,找出给定数字出现的次数比如{ 1, 2, 2, 2, 3}中2的出现次数是3次
我们可使用二分查找发,分别查找出2最先出现的位置和最后出现的位置相减即可。
下面是上代码:
#include <stdio.h>
//二分法获取元素最后出现的位置,可能在元素的下一位
int GetHigh(int array[], int size, int key)
{
int low = 0, high = size - 1;
while (low < high)
{
int mid = (low + high) / 2;
if (array[mid] <= key)
{
low = mid+1;
}
else
{
high = mid;
}
}
return low;
}
//二分法获取元素最先出现的位置,可能在元素的前一位
int GetLow(int array[], int size, int key)
{
int low = 0, high = size - 1;
while (low < high)
{
int mid = (low + high + 1) / 2;
if (array[mid] >= key)
{
high = mid-1;
}
else
{
low = mid;
}
}
return high;
}
//计算key出现总次数
int GetCount(int array[], int size, int key)
{
int high = GetHigh(array, size, key);
int low = GetLow(array, size, key);
int count = high - low + 1;
if (array[high] != key)
count--;
if (array[low] != key)
count--;
return count;
}
int arr[] = { 1, 2, 2, 2, 3};
int main()
{
//打印出2在数组中出现的次数
printf("出现次数:%d \n", GetCount(arr, 5, 2));
return 0;
}
运行效果如图:
如果有什么问题和疑问可以在下面留言互相探讨。
原题我已经上传到这里了http://download.csdn.net/detail/yincheng01/6461073 ,
解压密码为 c.itcast.cn