实现代码:
int GetFirstPosOfDestData(int* pData, int size, int destData, int begin, int end)
{
if (nullptr == pData || size < 1) return -1;
if (begin > end) return -1; // 未找到
int middle = begin + (end - begin) / 2; // 防止溢出,不要使用middle = (begin + end) / 2;
if (destData == pData[middle])
{
// 已经是第一个,或者前一个不等于destData
if (0 == middle || pData[middle - 1] != destData) return middle;
// 继续在前面区间查找
else end = middle - 1;
}
else if (destData > pData[middle]) begin = middle + 1;
else end = middle - 1;
return GetFirstPosOfDestData(pData, size, destData, begin, end);
}
int GetLastPosOfDestData(int* pData, int size, int destData, int begin, int end)
{
if (nullptr == pData || size < 1) return -1;
if (begin > end) return -1; // 未找到
int middle = begin + (end - begin) / 2; // 防止溢出,不要使用middle = (begin + end) / 2;
if (destData == pData[middle])
{
// 已经是最后一个,或者前一个不等于destData
if (end == middle || pData[middle + 1] != destData) return middle;
// 继续在后面区间查找
else begin = middle + 1;
}
else if (destData > pData[middle]) begin = middle + 1;
else end = middle - 1;
return GetLastPosOfDestData(pData, size, destData, begin, end);
}
int GetCountOfDestData(int* pData, int size, int destData)
{
if (nullptr == pData || size < 1) return 0;
int toalCount = 0;
int firstPos = GetFirstPosOfDestData(pData, size, destData, 0, size - 1);
int lastPos = GetLastPosOfDestData(pData, size, destData, 0, size - 1);
if (firstPos != -1 && lastPos != -1)toalCount = lastPos - firstPos + 1;
return toalCount;
}