00001 00004 template<class T> inline 00005 void _binary_sort(T *_P, T *_Q, T s) 00006 { 00007 T *P = _P, *Q = _Q; 00008 T p, q; 00009 while(P != Q) 00010 { 00011 if(((p = P[0]) & s) != 0) break; 00012 P++; 00013 } 00014 while(P != Q) 00015 { 00016 if(((q = Q[-1]) & s) == 0) break; 00017 Q--; 00018 } 00019 while(P != Q) 00020 { 00021 *P++ = q; 00022 *--Q = p; 00023 while(((p = P[0]) & s) == 0) P++; 00024 while(((q = Q[-1]) & s) != 0) Q--; 00025 } 00026 s >>= 1; 00027 if(s) 00028 { 00029 if(Q - _P > 1) _binary_sort(_P, Q, s); 00030 if(_Q - P > 1) _binary_sort(P, _Q, s); 00031 } 00032 } 00033 00037 template<class T, class S> inline 00038 void _binary_sort_copy(T *_P, T *_Q, S *_U, S* _V, T s) 00039 { 00040 T *P = _P, *Q = _Q; 00041 S *U = _U, *V = _V; 00042 T p, q; 00043 while(P != Q) 00044 { 00045 if(((p = P[0]) & s) != 0) break; 00046 P++; 00047 U++; 00048 } 00049 while(P != Q) 00050 { 00051 if(((q = Q[-1]) & s) == 0) break; 00052 Q--; 00053 V--; 00054 } 00055 while(P != Q) 00056 { 00057 *P++ = q; 00058 *--Q = p; 00059 S u, v; 00060 u = *U; 00061 v = *--V; 00062 *U++ = v; 00063 *V = u; 00064 while(((p = P[0]) & s) == 0) P++, U++; 00065 while(((q = Q[-1]) & s) != 0) Q--, V--; 00066 } 00067 s >>= 1; 00068 if(s) 00069 { 00070 if(Q - _P > 1) _binary_sort_copy(_P, Q, _U, V, s); 00071 if(_Q - P > 1) _binary_sort_copy(P, _Q, U, _V, s); 00072 } 00073 } 00074 00078 template<class T> inline 00079 void _binary_sort_sort(T *_P, T *_Q, T *_A, T *_B, T s, T t) 00080 { 00081 T *P = _P, *Q = _Q, *A = _A, *B = _B; 00082 T p, q; 00083 while(P != Q) 00084 { 00085 if(((p = P[0]) & s) != 0) break; 00086 P++; 00087 A++; 00088 } 00089 while(P != Q) 00090 { 00091 if(((q = Q[-1]) & s) == 0) break; 00092 Q--; 00093 B--; 00094 } 00095 while(P != Q) 00096 { 00097 *P++ = q; 00098 *--Q = p; 00099 T a, b; 00100 a = *A; 00101 b = *--B; 00102 *A++ = b; 00103 *B = a; 00104 while(((p = P[0]) & s) == 0) P++, A++; 00105 while(((q = Q[-1]) & s) != 0) Q--, B--; 00106 } 00107 s >>= 1; 00108 if(s) 00109 { 00110 if(Q - _P > 1) _binary_sort_sort(_P, Q, _A, B, s, t); 00111 if(_Q - P > 1) _binary_sort_sort(P, _Q, A, _B, s, t); 00112 } 00113 else if(t) 00114 { 00115 if(Q - _P > 1) _binary_sort_sort(_A, B, _P, Q, t, s); 00116 if(_Q - P > 1) _binary_sort_sort(A, _B, P, _Q, t, s); 00117 } 00118 } 00119 00123 template<class T, class S> inline 00124 void _binary_sort_sort_copy(T *_P, T *_Q, T *_A, T *_B, S *_U, S* _V, T s, T t) 00125 { 00126 T *P = _P, *Q = _Q, *A = _A, *B = _B; 00127 S *U = _U, *V = _V; 00128 T p, q; 00129 while(P != Q) 00130 { 00131 if(((p = P[0]) & s) != 0) break; 00132 P++; 00133 A++; 00134 U++; 00135 } 00136 while(P != Q) 00137 { 00138 if(((q = Q[-1]) & s) == 0) break; 00139 Q--; 00140 B--; 00141 V--; 00142 } 00143 while(P != Q) 00144 { 00145 *P++ = q; 00146 *--Q = p; 00147 T a, b; 00148 a = *A; 00149 b = *--B; 00150 *A++ = b; 00151 *B = a; 00152 S u, v; 00153 u = *U; 00154 v = *--V; 00155 *U++ = v; 00156 *V = u; 00157 while(((p = P[0]) & s) == 0) P++, A++, U++; 00158 while(((q = Q[-1]) & s) != 0) Q--, B--, V--; 00159 } 00160 s >>= 1; 00161 if(s) 00162 { 00163 if(Q - _P > 1) _binary_sort_sort_copy(_P, Q, _A, B, _U, V, s, t); 00164 if(_Q - P > 1) _binary_sort_sort_copy(P, _Q, A, _B, U, _V, s, t); 00165 } 00166 else if(t) 00167 { 00168 if(Q - _P > 1) _binary_sort_sort_copy(_A, B, _P, Q, _U, V, t, s); 00169 if(_Q - P > 1) _binary_sort_sort_copy(A, _B, P, _Q, U, _V, t, s); 00170 } 00171 } 00172 00176 template<class T, class S> inline 00177 void _fractal_sort_sort_copy(T *_P, T *_Q, T *_A, T *_B, S *_U, S* _V, T s, T t) 00178 { 00179 T *P = _P, *Q = _Q, *A = _A, *B = _B; 00180 S *U = _U, *V = _V; 00181 T p, q; 00182 while(P != Q) 00183 { 00184 if(((p = P[0]) & s) != 0) break; 00185 P++; 00186 A++; 00187 U++; 00188 } 00189 while(P != Q) 00190 { 00191 if(((q = Q[-1]) & s) == 0) break; 00192 Q--; 00193 B--; 00194 V--; 00195 } 00196 while(P != Q) 00197 { 00198 *P++ = q; 00199 *--Q = p; 00200 T a, b; 00201 a = *A; 00202 b = *--B; 00203 *A++ = b; 00204 *B = a; 00205 S u, v; 00206 u = *U; 00207 v = *--V; 00208 *U++ = v; 00209 *V = u; 00210 while(((p = P[0]) & s) == 0) P++, A++, U++; 00211 while(((q = Q[-1]) & s) != 0) Q--, B--, V--; 00212 } 00213 s >>= 1; 00214 if(t != 0) 00215 { 00216 if(Q - _P > 1) _fractal_sort_sort_copy(_A, B, _P, Q, _U, V, t, s); 00217 if(_Q - P > 1) _fractal_sort_sort_copy(A, _B, P, _Q, U, _V, t, s); 00218 } 00219 } 00220 00224 template<class T> inline 00225 T _binary_log(const T *P, const T *Q) 00226 { 00227 T s = 0; 00228 while(P != Q) 00229 { 00230 s |= *P++; 00231 } 00232 T t = ~0; 00233 while(s & t) 00234 { 00235 s &= t; 00236 t <<= 1; 00237 } 00238 return s; 00239 } 00240 00245 template<class T> inline 00246 void binary_sort(vector<T> &_V) 00247 { 00248 if(_V.size() < 2) return; 00249 _binary_sort(&_V[0], &_V[0]+_V.size(), _binary_log(&_V[0], &_V[0]+_V.size())); 00250 } 00251 00257 template<class T, class S> inline 00258 void binary_sort_copy(vector<T> &_V, vector<S> &_W) 00259 { 00260 if(_V.size() < 2) return; 00261 _binary_sort_copy(&_V[0], &_V[0]+_V.size(), &_W[0], &_W[0]+_W.size(), _binary_log(&_V[0], &_V[0]+_V.size())); 00262 } 00263 00269 template<class T> inline 00270 void binary_sort_sort(vector<T> &_V, vector<T> &_W) 00271 { 00272 if(_V.size() < 2) return; 00273 _binary_sort_sort(&_V[0], &_V[0]+_V.size(), &_W[0], &_W[0]+_W.size(), 00274 _binary_log(&_V[0], &_V[0]+_V.size()), _binary_log(&_W[0], &_W[0]+_W.size())); 00275 } 00276 00283 template<class T, class S> inline 00284 void binary_sort_sort_copy(vector<T> &_V, vector<T> &_W, vector<S> &_A) 00285 { 00286 if(_V.size() < 2) return; 00287 _binary_sort_sort_copy(&_V[0], &_V[0]+_V.size(), &_W[0], &_W[0]+_W.size(), &_A[0], &_A[0]+_A.size(), 00288 _binary_log(&_V[0], &_V[0]+_V.size()), _binary_log(&_W[0], &_W[0]+_W.size())); 00289 } 00290 00297 template<class T, class S> inline 00298 void fractal_sort_sort_copy(vector<T> &_V, vector<T> &_W, vector<S> &_A) 00299 { 00300 if(_V.size() < 2) return; 00301 T log = max(_binary_log(&_V[0], &_V[0]+_V.size()), _binary_log(&_W[0], &_W[0]+_W.size())); 00302 _fractal_sort_sort_copy(&_V[0], &_V[0]+_V.size(), &_W[0], &_W[0]+_W.size(), &_A[0], &_A[0]+_A.size(), log, log); 00303 } 00304 00310 template<class T, class S> inline 00311 void bucket_sort_count(const vector<T> &_U, vector<S> &_W) 00312 { 00313 const T *U = &_U[0], *V = &_U[0] + _U.size(); 00314 S *W = &_W[0]; 00315 00316 while(U != V) 00317 { 00318 W[*U++]++; 00319 } 00320 } 00321 00327 template<class T> inline 00328 T bucket_sort_size(const vector<T> &_U) 00329 { 00330 const T *U = &_U[0], *V = &_U[0] + _U.size(); 00331 00332 T t = 0; 00333 while(U != V) 00334 { 00335 t += *U++; 00336 } 00337 return t; 00338 } 00339 00345 template<class T> inline 00346 void bucket_sort_offset(const vector<T> &_U, vector<T> &_W) 00347 { 00348 const T *U = &_U[0], *V = &_U[0] + _U.size(); 00349 T *W = &_W[0]; 00350 00351 T t = 0; 00352 while(U != V) 00353 { 00354 T s = *U++; 00355 *W++ = t; 00356 t += s; 00357 } 00358 } 00359 00368 template<class T, class S, class C> inline 00369 void bucket_sort_copy(const vector<T> &_U, const vector<C> &_A, vector<C> &_B, vector<S> _W, int _n) 00370 { 00371 const T *U = &_U[0], *V = &_U[0] + _U.size(); 00372 const C *A = &_A[0]; 00373 C *B = &_B[0]; 00374 S *W = &_W[0]; 00375 00376 while(U != V) 00377 { 00378 T t = *U++; 00379 S s = W[t]; 00380 W[t]++; 00381 B = &_B[_n * s]; 00382 for(int i = 0; i < _n; i++) 00383 { 00384 *B++ = *A++; 00385 } 00386 } 00387 } 00388 00393 template<class T> inline 00394 void unique(vector<T> &_P) 00395 { 00396 if(_P.size() < 2) return; 00397 T *P = &_P[0], *Q = &_P[0] + _P.size(); 00398 00399 if(P != Q) 00400 { 00401 T* R = P; 00402 ++P; 00403 while(P != Q) 00404 { 00405 if ((*R != *P)) 00406 { 00407 *++R = *P; 00408 } 00409 ++P; 00410 } 00411 ++R; 00412 _P.resize(R - &_P[0]); 00413 } 00414 } 00415 00421 template<class T, class S> inline 00422 void unique_accumulate(vector<T> &_P, vector<S> &_A) 00423 { 00424 if(_P.size() < 2) return; 00425 T *P = &_P[0], *Q = &_P[0] + _P.size(); 00426 S *A = &_A[0]; 00427 00428 if(P != Q) 00429 { 00430 T* R = P; 00431 S* C = A; 00432 ++P; ++A; 00433 while(P != Q) 00434 { 00435 if (*R == *P) 00436 { 00437 *C += *A; 00438 } 00439 else 00440 { 00441 *++R = *P; 00442 *++C = *A; 00443 } 00444 ++P; ++A; 00445 } 00446 ++R; 00447 ++C; 00448 _P.resize(R - &_P[0]); 00449 _A.resize(C - &_A[0]); 00450 } 00451 } 00452 00459 template<class T, class S> inline 00460 void unique_accumulate(vector<T> &_P, vector<T> &_U, vector<S> &_A) 00461 { 00462 if(_P.size() < 2) return; 00463 T *P = &_P[0], *Q = &_P[0] + _P.size(); 00464 T *U = &_U[0]; 00465 S *A = &_A[0]; 00466 00467 if(P != Q) 00468 { 00469 T* R = P; 00470 T* W = U; 00471 S* C = A; 00472 ++P; ++U; ++A; 00473 while(P != Q) 00474 { 00475 if ((*R == *P) && (*W == *U)) 00476 { 00477 *C += *A; 00478 } 00479 else 00480 { 00481 *++R = *P; 00482 *++W = *U; 00483 *++C = *A; 00484 } 00485 ++P; ++U; ++A; 00486 } 00487 ++R; 00488 ++W; 00489 ++C; 00490 _P.resize(R - &_P[0]); 00491 _U.resize(W - &_U[0]); 00492 _A.resize(C - &_A[0]); 00493 } 00494 } 00495 00496 00507 template<class T> inline 00508 void global_intersection(const int _size, const int _rank, const vector<T> &_P, const vector<T> &_U, vector<T> &_A, vector<T> &_C, vector<T> &_D) 00509 { 00510 const T *P = &_P[0], *U = &_U[0]; 00511 T *A = &_A[0], *C = &_C[0], *D = &_D[0]; 00512 00513 int j = 0, k, l; 00514 int m = (int)_P.size(), n; 00515 for(int i = 0; i < _size; i++) 00516 { 00517 k = 0, l = D[i], n = l + C[i]; 00518 00519 D[i] = j; 00520 if(_rank != i) 00521 { 00522 while((k < m) && (l < n)) 00523 { 00524 if (P[k] < A[l]) 00525 { 00526 k++; 00527 } 00528 else if (A[l] < P[k]) 00529 { 00530 l++; 00531 } 00532 else 00533 { 00534 A[j] = U[k]; 00535 j++; 00536 k++; 00537 l++; 00538 } 00539 } 00540 } 00541 C[i] = j - D[i]; 00542 } 00543 _A.resize(j); 00544 } 00545