1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| int FindK_Min(int * ar, int n, int k) { if(ar==NULL || k<0 || k>n)return -1; return FindK(ar, 0, n-1, k); } int MaxS1(const int* ar, int left, int right) { return ar[right]; } int MinS2(const int* ar, int left, int right) { int min = ar[left]; for(int i = left + 1; i<=right; ++i) { if(min > ar[i]) { min = ar[i]; } } return min; } int Min(int a, int b) { return a < b ? a : b; } int Min(int a, int b, int c) { return Min(a, Min(b, c)); } int Cpair(int * ar, int left, int right) { if((right-left) <= 0) return INT_MAX; int mid = (right-left+1)/2; FindK(ar, left, right, mid); int pos = left + mid - 1; int d1 = Cpair(ar, left, pos); int d2 = Cpair(ar, pos+1,right); int maxs = MaxS1(ar, left, pos); int mins = MinS2(ar, pos+1, right); return Min(d1, d2, mins-maxs); } int Cpair_Ar(int * ar, int n) { if(ar==NULL || n<1)return INT_MAX; else return Cpair(ar, 0, n-1); }
|