在我的一个计算机科学考试中,这个问题已经过去了,但是我找不到任何答案。有时候我想知道它是否可能是原型。
目标是返回整数数组中第三大元素的索引。我已经学会了如何找到最大和第二大元素,但这似乎很难。
int third_max(int arr[],int size);
我正在寻找一个递归函数,它可以通过一个函数帮助找到它,即max(a,b)返回a,b的最大值。 编辑:没有重复的元素
答案 0 :(得分:0)
我对third_max()
的实施。 (它使用assert
来捕获比三个元素短的起始数组。)首先,它将数组中的前三个元素排序到位;如果数组只有三个元素长,则返回第一个元素。如果数组超过三个元素,则比较第一个和第四个元素,将较大的元素保留为第四个元素。最后,它调用它自我递归地删除第一个数组元素并描述数组大小:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define ARRAY_SIZE (10)
int third_max(int array[], size_t size) {
assert(size > 2);
if (array[0] > array[1]) {
int temp = array[1];
array[1] = array[0];
array[0] = temp;
}
if (array[1] > array[2]) {
int temp = array[2];
array[2] = array[1];
array[1] = temp;
}
if (array[0] > array[1]) {
int temp = array[1];
array[1] = array[0];
array[0] = temp;
}
if (size == 3) {
return array[0];
}
if (array[0] > array[3]) {
array[3] = array[0];
}
return third_max(array + 1, size - 1);
}
int compare(const void *a, const void *b) {
const int *aa = a;
const int *bb = b;
return (*aa > *bb) - (*aa < *bb);
}
int main() {
int array[ARRAY_SIZE], control[ARRAY_SIZE];
srandomdev();
for (int i = 0; i < ARRAY_SIZE; i++) {
int x = -1;
while (x == -1) {
x = (random() & 127) - 63;
for (int j = 0; j < i; j++) {
if (array[j] == x) { // avoid duplicates
x = -1;
break;
}
}
}
control[i] = array[i] = x;
}
printf("[");
for (int i = 0; i < ARRAY_SIZE; i++) {
printf("%d, ", array[i]);
}
printf("] -> ");
printf("%d ", third_max(array, ARRAY_SIZE));
qsort(control, ARRAY_SIZE, sizeof(int), &compare);
printf("(%d)\n", control[ARRAY_SIZE - 3]);
return 1;
}
其余代码通过创建唯一正整数数组来测试third_max()
函数。它将递归函数的结果与已排序的匹配控件数组的结果进行比较,并将提取的第三个元素与最后一个元素进行比较。
我的third_max()
不会调用除自身以外的任何其他函数(即没有帮助函数。)它对传入的数组具有破坏性。
答案 1 :(得分:-1)
没有任何额外的约束,一个天真但有效的解决方案只是创建数组的排序副本,取第三个元素,然后在原始数组中找到该元素并返回其索引。理论复杂度是时间上的O(n log n)和空间中的O(n)。 O(n)时间解决方案是可能的。