我有一个排序数组(按升序排列),我想找到下标 数组中的数字,是给定的下一个最高数字 数。例如,如果我有67作为给定的数字,如果我有一个数组 x =(23,36,45,62,79,103,109),那么如何从x得到下标5(到 在不使用for循环的情况下获得79,这是67的下一个最高?
答案 0 :(得分:3)
这是家庭作业吗?
您可以通过递归调用轻松完成,每次将数组拆分为一半。
答案 1 :(得分:1)
您必须使用二进制搜索。见维基百科。 http://en.wikipedia.org/wiki/Binary_search
同样在C中,您可以使用内置库函数bsearch
进行二进制搜索。 http://www.cplusplus.com/reference/clibrary/cstdlib/bsearch/
答案 2 :(得分:0)
以下代码将查找数组中下一个最高数字的索引。但是......
#include <stdio.h>
int findIndex(int *array, int value) {
static int index = 0;
index++;
if(array[index] > value)
printf("Index: %d\n", index);
else
return findIndex(array, value);
} // findIndex
int main() {
int x[] = {23, 36, 45, 62, 79, 103, 109};
findIndex(x, 67);
return 0;
}
此代码存在缺陷。你注意到了吗?
答案 3 :(得分:0)
a:数组。 低:起始指数。 高:最大指数。 number:要搜索的号码。
** int下标(int a [],int low,int high,int number)
{
int mid;
if (number > a[low] && number < a[high])
{
mid = (low+high)/2;
if a[mid] > number
{
if ( a[mid-1]<=number)
return mid;
else return subscript(a, low, mid-1);
}
if a[mid]<=number
{
if( a[mid+1] > number)
return mid+1;
else
return subscript(a, mid+1, high);
}
}
返回-1; 的} 强>
答案 4 :(得分:0)
我测试了这个:
〜&GT; a.out的 ARR = 23 36 45 62 79 103 109 值:79,指数:4
此代码中没有边界检查...
#include <stdio.h>
int findNum(int, int *, int *);
int main(int argc, char** argv) {
int list[7] = {23,36,45,62,79,103,109};
int i, val, idx = 0;
printf("ARR=");
for (i=0; i<7; i++) {
printf("%d ", list[i]);
}
val = findNum(67, list, &idx);
printf("\nvalue: %d, index: %d\n\n", val, idx);
return(0);
}
int findNum(int num, int *list, int *idx) {
if (*list <= num) {
*idx = (*idx)++;
return(findNum(num,list+1,idx));
}
}