Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 二进制搜索-如果我添加或删除“;1“;从列表的中间,我是得到中间那个左边的第一个数字还是一个数值?_C - Fatal编程技术网

C 二进制搜索-如果我添加或删除“;1“;从列表的中间,我是得到中间那个左边的第一个数字还是一个数值?

C 二进制搜索-如果我添加或删除“;1“;从列表的中间,我是得到中间那个左边的第一个数字还是一个数值?,c,C,我的怀疑发生在while循环中。当我将“1”添加到列表的最小值和最大值时,我在做什么?我是移动到列表上数字的左/右,还是以数字形式更改值?谢谢 bool search(int value, int values[], int n) { if (n < 0) { return false; } // beginning and final portions int min = 0; int max = n - 1; // m

我的怀疑发生在while循环中。当我将“1”添加到列表的最小值和最大值时,我在做什么?我是移动到列表上数字的左/右,还是以数字形式更改值?谢谢

bool search(int value, int values[], int n) {
    if (n < 0) {
        return false;
    }

    // beginning and final portions
    int min = 0;
    int max = n - 1;

    // middle variable
    int mid = n / 2;

    // this massive number will be useful to guarantee that the search function 
    // can handle incredibly large arrays
    const int MAX = 65536;

    while (n > 0) {
        if (value > value[middle]) {
            min = middle + 1;
        } else
        if (value < value[middle]) {
            max = middle - 1;
        } else
        if (value == value[middle]) {
            return true;
        }
    }
}
bool搜索(int值,int值[],int n){
if(n<0){
返回false;
}
//开头和结尾部分
int min=0;
int max=n-1;
//中间变量
int-mid=n/2;
//这个庞大的数字将有助于保证搜索功能
//可以处理非常大的阵列
常数int MAX=65536;
而(n>0){
如果(值>值[中间]){
最小=中间+1;
}否则
如果(值<值[中间]){
最大值=中间值-1;
}否则
如果(值==值[中间]){
返回true;
}
}
}

让我们假设您的值数组是这样的:1 2 5 6 9所以min=1,max=9,mid=5;现在假设您的值为7,那么
如果(value>value[middle]){min=middle+1;}
此块将处于活动状态

现在我们确定我们的值大于中间值,所以我们可以将最小值增加到值数组的第(中间+1)个索引


当它更小时,同样适用。所以实际上是移动值数组的最小/最大索引。希望对您有所帮助

您的功能在许多方面都被破坏了:

  • 它不实现二进制搜索
  • MAX
    并不庞大,甚至不在任何地方使用
  • middle
    未定义,在循环中未修改
  • value>value[middle]
    可能应该是
    value>values[middle]
下面是一个简单正确的实现(借用Matt Timmermans):

bool搜索(int值,int值[],大小){
大小\u t pos=0;
尺寸限制=n;
while(pos>1);
if(值[中间]<值)
pos=中间+1;
其他的
极限=中间;
}
返回pos
我怀疑它是否能编译
value[middle]
应该抱怨:数组名为
values
。回答您的问题:向数组索引添加数字会移动索引。但是,我认为您的循环是无限的。赋值运算符(
=
)修改其左侧操作数的值,在本例中为
max
min
。这些不是
数组的元素,而是特定有效值的索引。这可能是一个愚蠢的问题,但我如何知道min和max是数组的索引而不是简单变量@Elyasin@JohnBollinger如果你也能帮忙,谢谢你们两个@gcampeao您在代码中这样说:
//开始和结束部分
-索引是一个简单的整数类型变量。老实说,我建议你试着通过做一个教程或者阅读一本关于C编程语言的书来学习。
bool search(int value, int values[], size_t n) {
    size_t pos = 0;
    size_t limit = n;

    while (pos < limit) {
        size_t middle = pos + ((limit - pos) >> 1);

        if (values[middle] < value)
            pos = middle + 1;
        else
            limit = middle;
    }
    return pos < n && values[pos] == value;
}