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
- 如果项目超出范围