Changeset 15713
- Timestamp:
- Nov 29, 2007, 11:46:55 AM (18 years ago)
- Location:
- trunk/psLib/src
- Files:
-
- 1 added
- 3 edited
-
math/Makefile.am (modified) (1 diff)
-
math/psSort.h (added)
-
mathtypes/psVector.c (modified) (6 diffs)
-
types/psArray.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/math/Makefile.am
r12502 r15713 57 57 58 58 noinst_HEADERS = \ 59 md5.h 59 md5.h \ 60 psSort.h 60 61 61 62 CLEANFILES = *~ *.bb *.bbg *.da -
trunk/psLib/src/mathtypes/psVector.c
r15711 r15713 10 10 * @author Joshua Hoblitt, University of Hawaii 11 11 * 12 * @version $Revision: 1.10 0$ $Name: not supported by cvs2svn $13 * @date $Date: 2007-11-29 02:56:01$12 * @version $Revision: 1.101 $ $Name: not supported by cvs2svn $ 13 * @date $Date: 2007-11-29 21:46:54 $ 14 14 * 15 15 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 33 33 #include "psAssert.h" 34 34 #include "psString.h" 35 #include "psSort.h" 35 36 36 37 static void vectorFree(psVector* psVec) … … 341 342 } 342 343 343 // Heap sort of the array344 // XXX since the key size is fixed (same number of bits) a Radix sort could be345 // a big win here -- someone should benchmark this -JH346 347 // The following sort code is based on gsl_heapsort from GSL-1.8 (www.gnu.org/software/gsl), file348 // gsl-1.8/sort/sort.c, which is distributed under the GNU General Public License, version 2.349 //350 // Implement Heap sort -- direct and indirect sorting351 // Based on descriptions in Sedgewick "Algorithms in C"352 //353 // Copyright (C) 1999 Thomas Walter354 //355 // 18 February 2000: Modified for GSL by Brian Gough356 344 357 345 // Comparison and swap functions for sorting values directly … … 375 363 } 376 364 377 // Sort the heap 378 #define PSVECTOR_SORT_DOWNHEAP(SWAPTYPE, COMPAREFUNC, SWAPFUNC, K) { \ 379 unsigned long k = K; /* Local version of k --- so the higher-level version isn't modified */ \ 380 while (k <= N / 2) { \ 381 unsigned long j = 2 * k; \ 382 if (j < N && COMPAREFUNC(j, j + 1)) { \ 383 j++; \ 384 } \ 385 if (COMPAREFUNC(k, j)) { \ 386 SWAPFUNC(SWAPTYPE, j, k); \ 387 } else { \ 388 break; \ 389 } \ 390 k = j; \ 391 } \ 392 } 393 394 // Driver for heap sort 395 #define PSVECTOR_SORT_CASE(ELEMTYPE, SWAPTYPE, COMPAREFUNC, SWAPFUNC) \ 365 #define PSVECTOR_SORT_CASE(ELEMTYPE, COMPAREEXPR, SWAPFUNC, SWAPTYPE) \ 396 366 case PS_TYPE_##ELEMTYPE: { \ 397 367 ps##ELEMTYPE *value = vector->data.ELEMTYPE; \ 398 unsigned long N = vector->n - 1; /* Index of last element */ \ 399 unsigned long i = N / 2 + 1; /* Adding one to compensate for i-- below */ \ 400 do { \ 401 i--; \ 402 PSVECTOR_SORT_DOWNHEAP(SWAPTYPE, COMPAREFUNC, SWAPFUNC, i); \ 403 } while (i > 0); \ 404 while (N > 0) { \ 405 SWAPFUNC(SWAPTYPE, 0, N); /* Swap elements */ \ 406 /* Process the heap */ \ 407 N--; \ 408 PSVECTOR_SORT_DOWNHEAP(SWAPTYPE, COMPAREFUNC, SWAPFUNC, 0); \ 409 } \ 368 PSSORT(vector->n, COMPAREEXPR, SWAPFUNC, SWAPTYPE); \ 410 369 break; \ 411 370 } 412 // END of heap sort code from GSL413 371 414 372 bool psVectorSortInPlace(const psVector *vector) … … 422 380 423 381 switch (vector->type.type) { 424 PSVECTOR_SORT_CASE(U8 , U8 , PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT);425 PSVECTOR_SORT_CASE(U16, U16, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT);426 PSVECTOR_SORT_CASE(U32, U32, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT);427 PSVECTOR_SORT_CASE(U64, U64, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT);428 PSVECTOR_SORT_CASE(S8 , S8 , PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT);429 PSVECTOR_SORT_CASE(S16, S16, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT);430 PSVECTOR_SORT_CASE(S32, S32, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT);431 PSVECTOR_SORT_CASE(S64, S64, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT);432 PSVECTOR_SORT_CASE(F32, F32, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT);433 PSVECTOR_SORT_CASE(F64, F64, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT);382 PSVECTOR_SORT_CASE(U8 , PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, U8 ); 383 PSVECTOR_SORT_CASE(U16, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, U16); 384 PSVECTOR_SORT_CASE(U32, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, U32); 385 PSVECTOR_SORT_CASE(U64, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, U64); 386 PSVECTOR_SORT_CASE(S8 , PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, S8 ); 387 PSVECTOR_SORT_CASE(S16, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, S16); 388 PSVECTOR_SORT_CASE(S32, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, S32); 389 PSVECTOR_SORT_CASE(S64, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, S64); 390 PSVECTOR_SORT_CASE(F32, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, F32); 391 PSVECTOR_SORT_CASE(F64, PSVECTOR_SORT_COMPARE_DIRECT, PSVECTOR_SORT_SWAP_DIRECT, F64); 434 392 default: 435 393 psError(PS_ERR_BAD_PARAMETER_TYPE, true, … … 484 442 } 485 443 switch (vector->type.type) { 486 PSVECTOR_SORT_CASE(U8 , S32, PSVECTOR_SORT_COMPARE_INDEX, PSVECTOR_SORT_SWAP_INDEX);487 PSVECTOR_SORT_CASE(U16, S32, PSVECTOR_SORT_COMPARE_INDEX, PSVECTOR_SORT_SWAP_INDEX);488 PSVECTOR_SORT_CASE(U32, S32, PSVECTOR_SORT_COMPARE_INDEX, PSVECTOR_SORT_SWAP_INDEX);489 PSVECTOR_SORT_CASE(U64, S32, PSVECTOR_SORT_COMPARE_INDEX, PSVECTOR_SORT_SWAP_INDEX);490 PSVECTOR_SORT_CASE(S8 , S32, PSVECTOR_SORT_COMPARE_INDEX, PSVECTOR_SORT_SWAP_INDEX);491 PSVECTOR_SORT_CASE(S16, S32, PSVECTOR_SORT_COMPARE_INDEX, PSVECTOR_SORT_SWAP_INDEX);492 PSVECTOR_SORT_CASE(S32, S32, PSVECTOR_SORT_COMPARE_INDEX, PSVECTOR_SORT_SWAP_INDEX);493 PSVECTOR_SORT_CASE(S64, S32, PSVECTOR_SORT_COMPARE_INDEX, PSVECTOR_SORT_SWAP_INDEX);494 PSVECTOR_SORT_CASE(F32, S32, PSVECTOR_SORT_COMPARE_INDEX, PSVECTOR_SORT_SWAP_INDEX);495 PSVECTOR_SORT_CASE(F64, S32, PSVECTOR_SORT_COMPARE_INDEX, PSVECTOR_SORT_SWAP_INDEX);444 PSVECTOR_SORT_CASE(U8 , PSVECTOR_SORT_COMPARE_INDEX, PSVECTOR_SORT_SWAP_INDEX, S32); 445 PSVECTOR_SORT_CASE(U16, PSVECTOR_SORT_COMPARE_INDEX, PSVECTOR_SORT_SWAP_INDEX, S32); 446 PSVECTOR_SORT_CASE(U32, PSVECTOR_SORT_COMPARE_INDEX, PSVECTOR_SORT_SWAP_INDEX, S32); 447 PSVECTOR_SORT_CASE(U64, PSVECTOR_SORT_COMPARE_INDEX, PSVECTOR_SORT_SWAP_INDEX, S32); 448 PSVECTOR_SORT_CASE(S8 , PSVECTOR_SORT_COMPARE_INDEX, PSVECTOR_SORT_SWAP_INDEX, S32); 449 PSVECTOR_SORT_CASE(S16, PSVECTOR_SORT_COMPARE_INDEX, PSVECTOR_SORT_SWAP_INDEX, S32); 450 PSVECTOR_SORT_CASE(S32, PSVECTOR_SORT_COMPARE_INDEX, PSVECTOR_SORT_SWAP_INDEX, S32); 451 PSVECTOR_SORT_CASE(S64, PSVECTOR_SORT_COMPARE_INDEX, PSVECTOR_SORT_SWAP_INDEX, S32); 452 PSVECTOR_SORT_CASE(F32, PSVECTOR_SORT_COMPARE_INDEX, PSVECTOR_SORT_SWAP_INDEX, S32); 453 PSVECTOR_SORT_CASE(F64, PSVECTOR_SORT_COMPARE_INDEX, PSVECTOR_SORT_SWAP_INDEX, S32); 496 454 default: 497 455 psError(PS_ERR_BAD_PARAMETER_TYPE, true, -
trunk/psLib/src/types/psArray.c
r15454 r15713 9 9 * @author Ross Harman, MHPCC 10 10 * 11 * @version $Revision: 1.6 5$ $Name: not supported by cvs2svn $12 * @date $Date: 2007-11- 05 23:42:46$11 * @version $Revision: 1.66 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2007-11-29 21:46:55 $ 13 13 * 14 14 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 33 33 #include "psAbort.h" 34 34 #include "psAssert.h" 35 #include "psSort.h" 35 36 36 37 #define DEFAULT_ARRAY_ADD 10 // Default number to add to an array when not specified … … 243 244 } 244 245 246 // Comparison and swap functions for sorting values directly 247 #define PSARRAY_SORT_COMPARE_INDEX(A,B) (func(array[index[A]], array[index[B]]) < 0) 248 #define PSARRAY_SORT_SWAP_INDEX(TYPE,A,B) { \ 249 if (A != B) { \ 250 ps##TYPE temp = index[A]; \ 251 index[A] = index[B]; \ 252 index[B] = temp; \ 253 } \ 254 } 255 245 256 // Heap sort of the index array 246 257 psVector *psArraySortIndex (psVector *out, psArray *in, psCompareFunc func) { … … 250 261 } 251 262 252 // XXX isn't this line a waste of space?253 out = psVectorRecycle(out, in->n, PS_TYPE_S32); // Vector for output254 263 out = psVectorCreate(out, 0, in->n, 1, PS_TYPE_S32); 255 long N = out->n; // Number of elements 256 if (N < 2) { 257 return out; 258 } 259 260 long I = N >> 1; 261 long J = N - 1; 262 263 int result; 264 265 psS32 temp; 266 psS32 *index = out->data.S32; 267 while (1) { 268 if (I > 0) { 269 // I--; 270 temp = index[--I]; 271 } else { 272 temp = index[J]; 273 index[J] = index[0]; 274 // J--; 275 if (--J == 0) { 276 index[0] = temp; 277 return out; 278 } 279 } 280 long i = I; 281 long j = (I << 1) + 1; 282 while (j <= J) { 283 if (j < J) { 284 result = func (in->data[index[j]], in->data[index[j+1]]); 285 if (result < 0) { 286 j++; 287 } 288 } 289 result = func (in->data[temp], in->data[index[j]]); 290 if (result < 0) { 291 index[i]=index[j]; 292 j += (i=j) + 1; 293 } else { 294 j = J + 1; 295 } 296 } 297 index[i] = temp; 298 } 299 psAbort ("impossible to reach here"); 264 psS32 *index = out->data.S32; // Dereference index vector 265 psPtr *array = in->data; // Dereference input array 266 PSSORT(out->n, PSARRAY_SORT_COMPARE_INDEX, PSARRAY_SORT_SWAP_INDEX, S32); 267 return out; 300 268 } 301 269
Note:
See TracChangeset
for help on using the changeset viewer.
