特定的排序数组搜索

时间:2014-05-29 22:11:17

标签: arrays

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

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);

要求尽可能做到最佳。

1 个答案:

答案 0 :(得分:0)

我的解决方案基于二进制搜索。每次挑选一半时,算法会检查half是否大于begin

  • 如果是这种情况,则必须对beginhalf之间的所有项目进行排序。算法检查所需项目是否在*begin - *half范围内
    • 如果是,那么在那个地方进行另一次搜索(在这种情况下有可能使用普通二进制搜索)
    • 否则必须在halfend
    • 之间进行搜索
  • 如果halfbegin更爱,则该范围内必须有“斜率”,因此

    • 如果项目超出范围*begin*half算法应在beginhalf
    • 之间进行搜索
    • 如果项目在范围*begin范围内且*half算法应在halfend之间搜索

      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;
      }