您将获得一个已排序的数组,例如:
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);
要求尽可能做到最佳。
答案 0 :(得分:0)
我的解决方案基于二进制搜索。每次挑选一半时,算法会检查half
是否大于begin
。
begin
和half
之间的所有项目进行排序。算法检查所需项目是否在*begin
- *half
范围内
half
和end
如果half
比begin
更爱,则该范围内必须有“斜率”,因此
*begin
且*half
算法应在begin
和half
如果项目在范围*begin
范围内且*half
算法应在half
和end
之间搜索
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;
}