Ваш двоичный поиск неверен.
Вы не должны сравнивать i
с j
, вам нужно сравнить сумму. Кроме того, это проще, если вы бинарный поиск для x - arr[i]
.
Algorithm BinarySearch(arr,arr[i],p,q)
if (p == q)
if (arr[p] == x - arr[i])
return p
else
return NO_SOLUTION
j<--[(p+q)/2] // you forgot parentheses
If (arr[j] = x - arr[i])
Return arr[j]
else if (arr[j] > x - arr[i]) // our number is too big, restrict the search to smaller numbers
Return BinarySearch(arr,arr[i],p,j)
else
Return BinarySearch(arr,arr[i],j+1,q) // arr[i] doesn't change
Кроме того, вы продолжаете перезаписывать m
в своей основной функции. Вам нужно что-то вроде этого:
Algorithm Sum(arr,1,n):
MergeSort(arr)
m = NO_SOLUTION
For i<-- 1 to n - 1
if (m = NO_SOLUTION)
m<-- BinarySearch(arr,arr[i],i+1,n)
else
break;
if (m = NO_SOLUTION)
return NO_SOLUTION
else
return m and arr[i]
Это гарантирует, что вы остановитесь после того, как найдете решение. В вашем случае алгоритм всегда будет возвращать NO_SOLUTION
, поскольку нет ничего, с чем можно сгруппировать последний элемент Кроме того, вам нужно подняться до n - 1
по той же причине.