【发布时间】:2020-11-02 22:29:11
【问题描述】:
我必须在 C 中编写一个函数,该函数将数组和数组的维度作为输入。 我们假设该数组具有以下特征:
- 数组中的每个元素都不同
- 数组的第一个元素是奇数,其余元素是偶数
- 数组中至少有一个奇数元素和一个偶数元素
该函数必须使用分而治之的方法返回偶数元素的第一个索引,并且算法的成本应该是 O(log(n))。
在正常情况下,我会使用这样的函数:
int foo(int v[], int n){
for(int i=0; i<n; i++){
if(v[i]%2==0)
return i;
}
}
但我不知道如何用分而治之的方法解决这个问题。 是否可以使用修改版的合并排序或快速排序算法来解决问题?
【问题讨论】:
-
提示:看看二分搜索。
-
用笔和纸。创建一些这样的数组。您真的必须逐个查看数组才能找到奇数变为偶数的点吗?
-
或者换一种说法。我这里有这样一个数组,有 1000 个条目。您可以要求单个条目来查找边界。你会问我索引 1,2,3,4,5,6, ...125, ...250,... 500, .... 997, 998, 999 吗?
-
这与在排序数组中搜索数字没有太大区别,您查看中间索引,然后如果没有找到重做中间或好的方面等,所以每次将大小除以 2复杂度是 log2(n),这里好的一面取决于奇数/偶数
-
为了添加到其他 cmets,二分搜索背后的想法类似于您在印刷字典或电话簿中进行搜索的方式。想象一下,你有一本有数千页的大书,里面有奇数和偶数。 你如何找到边界?
标签: arrays c algorithm function sorting