问题:给一系列a1、a2.。。。an,要求找出其中两个数ai和aj,
使ai+aj=X,算法复杂度为O(nlogn)。
思路是:先快速排序
然后用i j 分别指向头,尾
比较ai+aj?X
如果ai+aj>X j--
如果ai+aj<X i++
/* 问题:给一系列a1、a2.。。。an,要求找出其中两个数ai和aj, 使ai+aj=X,算法复杂度为O(nlogn)。 思路是:先快速排序 然后用i j 分别指向头,尾 比较ai+aj?X 如果ai+aj>X j-- 如果ai+aj<X i++ */ #include <stdio.h> int Partition(int a[], int p, int q) { int c,temp; c = a[p]; while(p<q) { while(p<q && a[q]>=c) q--; a[p] = a[q]; while(p<q && a[p]<=c) p++; a[q] = a[q]; }; a[p] = c; return p; } void QuickSort(int a[], int p, int q) { int c=0; if(p<q) { c = Partition(a, p, q); QuickSort(a, p, c-1); QuickSort(a, c+1, q); } } int main() { int X,i,j; int a[10] = {1, 3, 5, 6, 8, 10, 15, 17, 20, 45}; X = 13; QuickSort(a, 0, 9); for(i=0; i<10; i++) printf("%d ", a[i]); printf("/n"); i=0; j=9; while(i<j) { while(i<j && a[i]+a[j]>X) j--; while(i<j && a[i]+a[j]<X) i++; if(a[i]+a[j]==X) { printf("%d+%d=%d!", a[i], a[j], X); getchar(); getchar(); return 1; } } printf("Failure!"); getchar(); return 0; }