排序数组 c++ 中的递归二叉搜索

Recursive binary search in sorted array c++

本文关键字:搜索 递归 数组 c++ 排序      更新时间:2023-10-16

我必须编写一个递归函数来搜索排序数组。

#include <iostream>
using namespace std;
int find(int value, int* folge, int max) {
}

int main() {
    int const n = 7;
    int wert1 = 4, wert2 = 13, wert3 = 2, wert4 = 25;
    int folge[n] = {3,4,9,13,13,17,22};
    wert1 = find(wert1, folge, n);
}

这是提供给我们的代码部分,我们必须完成它。
如果您有 4 个可用变量,我知道该怎么做。(最小值和最大值(但是我只有三个,有没有办法编辑给定下一个函数的数组的起点?

假设你有你的四参数版本:

find(value, array, min, max);

使用三参数版本,您可以调用:

find(value, array + min, max);

请注意,数组的第max个元素实际上是array + min的第max-min个元素,因此根据您的实现,您可能需要调用

find(value, array + min, max - min);

该函数可以按以下方式编写

#include <iostream>
int find( int value, int* folge, int max ) 
{
    if ( max == 0 ) return -1;
    int middle = max / 2;
    if ( folge[middle] == value ) return middle;
    bool lower = value < folge[middle];
    int n = lower ? find( value, folge, middle ) 
                  : find( value, folge + middle + 1, max - middle - 1 );
    return n != -1 && !lower ? n + middle + 1: n; 
}
int main()
{
    int const n = 7;
    int wert1 = 4, wert2 = 13, wert3 = 2, wert4 = 25;
    int folge[n] = {3,4,9,13,13,17,22};
    std::cout << wert1 << " = " << find(wert1, folge, n) << std::endl;
    std::cout << wert2 << " = " << find(wert2, folge, n) << std::endl;
    std::cout << wert3 << " = " << find(wert3, folge, n) << std::endl;
    std::cout << wert4 << " = " << find(wert4, folge, n) << std::endl;
    return 0;
}

程序输出为

4 = 1
13 = 3
2 = -1
25 = -1

或再一个测试程序

#include <iostream>
int find( int value, int* folge, int max ) 
{
    if ( max == 0 ) return -1;
    int middle = max / 2;
    if ( folge[middle] == value ) return middle;
    bool lower = value < folge[middle];
    int n = lower ? find( value, folge, middle ) 
                                  : find( value, folge + middle + 1, max - middle - 1 );
    return n != -1 && !lower ? n + middle + 1: n; 
}
int main()
{
    int const n = 7;
    int folge[n] = {3,4,9,13,13,17,22};
    for ( int x : { 2, 3, 4, 9, 13, 17, 22, 25 } )
    {
        std::cout << x << " -> " << find( x , folge, n ) << std::endl;  
    }        
    return 0;
}

它的输出是

2 -> -1
3 -> 0
4 -> 1
9 -> 2
13 -> 3
17 -> 5
22 -> 6
25 -> -1
find( &folge[1],...) // ignore first element

第 n 个元素的地址是一个大小为 n 的数组

如果folge指向第一个元素,则folge+1将指向第二个元素。

int find(int value, int* folge, int max)
{
    int m = max/2;
    if (0 == max)
    {
        return -1;
    }
    if (value == folge[m])
    {
        return value;
    }
    else if (value < folge[m])
    {
        return find(value, folge, m);
    } else
    {
        return find(value, folge + m + 1, max - m - 1);
    }
}

您可以更改 int 指针的值folge

int find(int value, int* folge, int max) {
   if (max == 0) {
        return -1;
   }
   int mid=max/2;
   if (value == folge[mid])
   {
        return mid;
   }
   int base=0;
   if (value < folge[mid])
   {
       max=mid-1;
   }
   else
   {
       max-=(mid+1);
       base=mid+1;
   }
   int ret=find(value,folge+base,max);
   if (ret == -1)
   {
       return -1;
   }
   return ret+base;
}