题目:设有序数组A有n个数,给定选取其中的两个元素L和U,L<U,设计算法统计A中满足L<x<u的所有x的个数(用递归和分治来做)
思想:
二分查找法结合递归思想,找到左右边界的下标相减即可。
代码展示:
#include <stdio.h>
#include <stdlib.h>
/*
* 题目:设有序数组A有n个数,给定选取其中的两个元素L和U,L<U,设计算法统计A中满足L<x<u的所有x的个数(用递归和分治来做)
* */
int search(int *arr,int U,int &p,int &q)
{
if(p<=q)
{
int mid = (p+q)/2;
if(arr[mid]==U)
{
return mid;
}
if(U>arr[mid])
{
p = mid+1;
search(arr,U,p,q);
}
else if(arr[mid]>U)
{
q = mid-1;
search(arr,U,p,q);
}
}
else
{
printf("未找到该边界元素:%d",U);
return -1;
}
}
int main() {
int arr[] = {1,2,5,7,15,20,21,21,27,31,32,64,68,71,73,89,94,100};
int L,U;
printf("请输入左边界L:");
scanf("%d",&L);
printf("请输入左边界U:");
scanf("%d",&U);
int length = sizeof(arr)/ sizeof(int);
int p = 0;
int q = length-1;
int flag1 = search(arr,L,p,q);
p = 0;q = length-1;//归位
int flag2 = search(arr,U,p,q);
if(flag1!=-1 && flag2!=-1)
{
int count = flag2-flag1-1;
printf("该范围内一共有%d个元素\n",count);
}
return 0;
}