Вот попытка на C. Это не помечено как домашнее задание.
// Assumes a sorted integer array with no duplicates
void printMatching(int array[], int size, int sum)
{
int i = 0, k = size - 1;
int curSum;
while(i < k)
{
curSum = array[i] + array[k];
if(curSum == sum)
{
printf("Found match at indices %d, %d\n", i, k);
i++;k--;
}
else if(curSum < sum)
{
i++;
}
else
{
k--;
}
}
}
Вот некоторые результаты теста с использованием int a[] = { 3, 5, 6, 7, 8, 9, 13, 15, 17 };
Searching for 12..
Found match at indices 0, 5
Found match at indices 1, 3
Searching for 22...
Found match at indices 1, 8
Found match at indices 3, 7
Found match at indices 5, 6
Searching for 4..
Searching for 50..
Поиск линейный, поэтому O (n). Сортировка, которая происходит за кулисами, будет O (n * logn), если вы используете один из хороших сортов.
Из-за математики, лежащей в основе Big-O, меньший член в аддитивных терминах будет эффективно выпадать из вашего расчета, и вы получите O (n logn).