呼叫
MinMaxArray(arr, (size - 1), &min)
指定的第三個參數具有相對於參數聲明類型錯誤。
參數的類型爲int **
,而參數的類型爲int *
。
此外,不計算最小元素。
在C++中有一個名爲minmax_element
的標準算法,它返回一對指向數組最小元素的指針。
你可以使用C語言編寫的
另一種方法的功能類似的聲明以返回一對最小和最大元素的索引。
爲此,您需要聲明兩個數據成員的結構。
下面示出如何返回一對指數能夠以C實現的功能
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct MinMax
{
size_t min;
size_t max;
};
struct MinMax minmax_element(const int a[], size_t n)
{
struct MinMax minmax = { 0, 0 };
if (n > 1)
{
struct MinMax current = minmax_element(a + 1, n - 1);
++current.min; ++current.max;
if (a[current.min] < a[minmax.min]) minmax.min = current.min;
if (a[minmax.max] < a[current.max]) minmax.max = current.max;
}
return minmax;
}
#define N 10
int main(void)
{
int a[N];
srand((unsigned int)time(NULL));
for (size_t i = 0; i < N; i++) a[i]= rand() % (2 * N);
for (size_t i = 0; i < N; i++) printf("%d ", a[i]);
putchar('\n');
struct MinMax minmax = minmax_element(a, N);
printf("The minimum is %d\n", a[minmax.min]);
printf("The maximum is %d\n", a[minmax.max]);
return 0;
}
它的輸出可能看起來像
14 6 7 9 6 7 15 12 0 10
The minimum is 0
The maximum is 15
考慮到用戶可以通過函數是一個「空」數組,即與數組大小相對應的參數等於0時的數組。在這種情況下,您自己的函數實現具有未定義的行爲。
如果不可以使用結構,那麼該函數可以聲明如下
void minmax_element(const int a[], size_t n, size_t *min, size_t *max);
或者
void minmax_element(const int a[], size_t n, int **min, int **max);
這不會是很難根據這些聲明的上面顯示的遞歸函數改變。
例如
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void minmax_element(const int a[], size_t n, size_t *min, size_t *max)
{
*min = 0;
*max = 0;
if (n > 1)
{
size_t cur_min, cur_max;
minmax_element(a + 1, n - 1, &cur_min, &cur_max);
++cur_min; ++cur_max;
if (a[cur_min] < a[*min]) *min = cur_min;
if (a[*max] < a[cur_max]) *max = cur_max;
}
}
#define N 10
int main(void)
{
int a[N];
srand((unsigned int)time(NULL));
for (size_t i = 0; i < N; i++) a[i]= rand() % (2 * N);
for (size_t i = 0; i < N; i++) printf("%d ", a[i]);
putchar('\n');
size_t min;
size_t max;
minmax_element(a, N, &min, &max);
printf("The minimum is %d\n", a[min]);
printf("The maximum is %d\n", a[max]);
return 0;
}
'&min' - >'min'。 – BLUEPIXY
爲什麼你有第三個說法?你從不使用它。 – Beta
...哦,並將'>'更改爲'<'。 – Beta