Arrays 特定排序数组搜索

Arrays 特定排序数组搜索,arrays,Arrays,您将获得一个排序数组,例如: 1 2 3 5 7 9 10 12 13 15 17 1 2 3 5 7 9 10 12 13 15 17 然后,在一个(随机)部分将其拆分为两个数组,例如: 1 2 3 5 7 9 10 12 13 15 17 1 2 3 5 7 9 10 12 13 15 17 然后,它再次合并在一起,但如下所示: 10 12 13 15 17 1 2 3 5 7 9 要求它编写一个函数,在新数组中搜索特定元素并返回其位置: int find(int* newArra

您将获得一个排序数组,例如:

1 2 3 5 7 9 10 12 13 15 17
1 2 3 5 7 9
10 12 13 15 17
然后,在一个(随机)部分将其拆分为两个数组,例如:

1 2 3 5 7 9 10 12 13 15 17
1 2 3 5 7 9
10 12 13 15 17
然后,它再次合并在一起,但如下所示:

10 12 13 15 17 1 2 3 5 7 9
要求它编写一个函数,在新数组中搜索特定元素并返回其位置:

int find(int* newArray, int arrayLength, int elementToFind);

它被要求尽可能优化。我的解决方案是基于二进制搜索。每次拾取一半时,算法检查
half
是否大于
begin

  • 如果是这种情况,则必须对
    begin
    half
    之间的所有项目进行排序。算法检查所需项目是否在范围内
    *begin
    -
    *half
    • 如果是这样,则在该位置进行另一次搜索(在这种情况下,可以使用普通二进制搜索)
    • 否则,必须在
      half
      end
  • 如果
    half
    大于
    begin
    则该范围内必须有一个“斜率”,因此

    • 如果项目超出范围
      *begin
      *half
      算法应在
      begin
      half
      之间搜索
    • 如果项目在范围内
      *开始
      *一半
      算法应在
      一半
      结束

      int* find2(int* begin, int* end, int elementToFind)
      {
          int* half = begin + (end-begin + 1)/2;
      
          if(*begin == elementToFind)
          {
              return begin;
          }
      
          if(*half > *begin)
          {
              if(*half > elementToFind && *begin < elementToFind)
              {
                  return find2(begin, half, elementToFind);
              }
              else
              {
                  return find2(half, end, elementToFind);
              }
          }
          else
          {
              if(*half <= elementToFind && *begin > elementToFind)
              {
                  return find2(half, end, elementToFind);
              }
              else
              {
                  return find2(begin, half, elementToFind);
              }
          }
      }
      
      int find(int* newArray, int arrayLength, int elementToFind)
      {
          return find2(newArray, newArray+arrayLength-1, elementToFind) - newArray;
      }
      
      int*find2(int*begin,int*end,int-elementToFind)
      {
      int*half=begin+(end-begin+1)/2;
      如果(*开始==elementToFind)
      {
      返回开始;
      }
      如果(*一半>*开始)
      {
      如果(*half>elementToFind&&*begin

您的问题是什么?你试过什么?请发布您的工作。您知道这两个阵列分别有多长吗?如果是这样,则只需根据要搜索的值是否大于或小于数组中的第一个值,搜索最终数组的一部分。