#include <stdio.h>
int process(int arr[], int L, int R);
int max(int lm, int rm);
int main() {
int arr1[] = { 14, 5, 6, 3, 8, 5, 6, 4 };
int max = process(arr1, 0, (sizeof(arr1) / sizeof(arr1[0])) - 1);
printf("%d", max);
}
int max(int lm, int rm) {
return lm > rm ? lm : rm;
}
int process(int arr[], int L, int R) {
if (L == R) {
return arr[L];
}
int mid = L + (R - L) >> 1;
if (mid > 0) {
int leftMax = process(arr, L, mid);
int rightMax = process(arr, mid + 1, R);
return max(leftMax, rightMax);
} else {
return 0;
}
}
Sou um novato, recentemente comecei a aprender algoritmos. Este é um procedimento para encontrar o valor máximo de um array por divisão e conquista. Ele foi transplantado do java, fiz alguns ajustes. Mas quando eu o executo, acontece uma falha de segmentação.
Existem vários problemas:
L + (R - L) >> 1
é avaliado como(L + (R - L)) >> 1
porque>>
tem precedência menor que+
, o que é um tanto contraintuitivo. Você deve colocar a expressão entre parênteses comoL + ((R - L) >> 1)
.L == 0
eR == 1
não é tratado corretamente:mid
será0
portanto o valor0
é retornado arbitrariamente. Você não deve fazer um caso especial demid > 0
.Aqui está uma versão modificada:
É por causa da precedência do operador .
+
tem precedência maior que>>
, então issoé o mesmo que
e não o pretendido
ou o mais direto: