#include<stdio.h>
#include<iostream>
#include<exception>
using namespace std;
class Arrayexception: public std::exception{
virtual const char *what() const throw()
{
return "Error";
}
};
static int FindCountNum(int *arr, int start_index, int end_index, int index)
{
// debug
#if 0
int i = 0;
for(i=start_index;i<=end_index;i++){
cout << arr[i] << "\t";
}
cout << endl;
#endif
int mid_index = 0;
int count = 0;
int ahead = 0;
int latter = 0;
if(arr==NULL||start_index>end_index){
throw Arrayexception();
}
mid_index = (start_index+end_index)/2;
// 存在三个以上数据
if(mid_index!=start_index){
if(arr[mid_index]>index){
count += FindCountNum(arr, start_index,mid_index,index);
}else if(arr[mid_index]<index){
count += FindCountNum(arr, mid_index, end_index,index);
}else{
count++;
if(start_index!=mid_index){
count += FindCountNum(arr, start_index,mid_index-1,index);
count += FindCountNum(arr, mid_index+1, end_index,index);
}
}
// 只存在两个数据
}else if(start_index==end_index-1){
if(arr[start_index]==index)
count++;
if(arr[end_index]==index)
count++;
// 只剩下单个数据
}else{
if(arr[start_index]==index)
count++;
}
return count;
}
int main()
{
// 单调升序
int arr1[] = {3,14,15,20,20};
cout << FindCountNum(arr1, 0, 4, 20) << endl;
int arr2[] = { 1, 7, 9, 12, 14};
cout << FindCountNum(arr2, 0, 4, 1) << endl;
// 有相同元素且最小值为相同元素
int arr3[] = {1, 1, 2, 3, 4, 5};
cout << FindCountNum(arr3, 0, 5, 1) << endl;
// 有相同元素且最小值不为相同元素
int arr4[] = {0, 0, 1, 1, 1};
cout << FindCountNum(arr4, 0, 4, 1) << endl;
// 单调升数组
int arr5[] = {1, 2, 3, 4, 5};
cout << FindCountNum(arr5, 0, 4, 2) << endl;
// 只有一个数字
int arr6[] = {2};
cout << FindCountNum(arr6, 0, 0, 2) << endl;
// 有相同元素且最小值不为相同元素
int arr7[] = {1, 2, 2, 3, 4, 5};
cout << FindCountNum(arr7, 0, 4, 2) << endl;
}
【算法】【数据在排序数组中出现的次数】
猜你喜欢
转载自blog.csdn.net/feifei_csdn/article/details/81121616
今日推荐
周排行