Можно отсортировать массив и потом за один проход найти все пары.
Например так:
src = [1, 5, 9, 11, 10, 4]
src.sort()
[print('{0:d} - {1:d}'.format(src[i], src[i + 1])) for i in range(len(src)-1) if src[i + 1] - src[i] == 1]
Результат:
4 - 5
9 - 10
10 - 11
По сложности это лучше полного перебора.
Сортировка на месте - O(N*log(N))
Проход по списку еще O(N).
Т.е. в целом O(N*(1 + log(N)))
В случае полного перебора O(N*N)
Но тут есть дублирование, число 10 входит в 2 пары, как его исключить и какую пару оставить решайте сами.