思路:若数组无序,则先将数组排为升序。设给定值为sum,维护两个指针p和q,p指向数组头部,q指向数组尾部。若*p+*q < sum,则p++;若*p+*q > sum,则q--;若*p+*q == sum,则存在这两个数;程序中止条件为p == q(因此避免了*p+*q == sum且p == q的情况)
代码如下:
int process(int a[], int n, int sum){
assert(a != NULL);
assert(n > 1);
int p = 0, q = n-1;
int tmp;
while(p < q){
tmp = a[p]+a[q];
if(tmp < sum) p++;
else if(tmp > sum) q--;
else break;
}
if(p < q) return 1; //存在
else return 0;
}