Changeset 20936 for trunk/Ohana/src/opihi/cmd.data/sort.c
- Timestamp:
- Dec 7, 2008, 3:31:01 PM (18 years ago)
- File:
-
- 1 edited
-
trunk/Ohana/src/opihi/cmd.data/sort.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana/src/opihi/cmd.data/sort.c
r7917 r20936 1 1 # include "data.h" 2 2 3 void fsortindex (opihi_flt *X, int *IDX, int N) { 4 5 # define SWAPFUNC(A,B){ opihi_flt tmp; int itmp; \ 6 tmp = X[A]; X[A] = X[B]; X[B] = tmp; \ 7 itmp = IDX[A]; IDX[A] = IDX[B]; IDX[B] = itmp; \ 8 } 9 # define COMPARE(A,B)(X[A] < X[B]) 10 11 OHANA_SORT (N, COMPARE, SWAPFUNC); 12 13 # undef SWAPFUNC 14 # undef COMPARE 15 16 } 17 18 void isortindex (opihi_int *X, int *IDX, int N) { 19 20 # define SWAPFUNC(A,B){ opihi_int tmp; int itmp; \ 21 tmp = X[A]; X[A] = X[B]; X[B] = tmp; \ 22 itmp = IDX[A]; IDX[A] = IDX[B]; IDX[B] = itmp; \ 23 } 24 # define COMPARE(A,B)(X[A] < X[B]) 25 26 OHANA_SORT (N, COMPARE, SWAPFUNC); 27 28 # undef SWAPFUNC 29 # undef COMPARE 30 31 } 32 33 // XXX add an option to NOT sort, but return an index instead? 3 34 int sort_vectors (int argc, char **argv) { 4 35 5 36 int i, j, Nvec, Nval; 6 float *temp, *index, *T, *V, *I; 37 opihi_flt *ftemp; 38 opihi_int *itemp; 39 int *index, *I; 7 40 Vector **vec; 8 41 … … 35 68 } 36 69 37 /* create index (use float to use sortpair)*/38 ALLOCATE (index, float, Nval);70 /* create index */ 71 ALLOCATE (index, int, Nval); 39 72 for (i = 0; i < Nval; i++) index[i] = i; 40 73 41 74 /* sort key & index */ 42 fsortpair (vec[0][0].elements, index, Nval); 75 if (vec[0][0].type == OPIHI_FLT) { 76 fsortindex (vec[0][0].elements.Flt, index, Nval); 77 } else { 78 isortindex (vec[0][0].elements.Int, index, Nval); 79 } 43 80 44 ALLOCATE (temp, float, Nval); 81 ALLOCATE (ftemp, opihi_flt, Nval); 82 ALLOCATE (itemp, opihi_int, Nval); 83 45 84 for (i = 1; i < Nvec; i++) { 46 T = temp; 47 V = vec[i][0].elements; 48 I = index; 49 for (j = 0; j < Nval; j++, T++, I++) { 50 *T = V[(int)(*I)]; 85 if (vec[i][0].type == OPIHI_FLT) { 86 opihi_flt *T = ftemp; 87 opihi_flt *V = vec[i][0].elements.Flt; 88 I = index; 89 for (j = 0; j < Nval; j++, T++, I++) { 90 *T = V[*I]; 91 } 92 /* swap .elements.Flt (== V) and ftemp */ 93 vec[i][0].elements.Flt = ftemp; 94 ftemp = V; 95 } else { 96 opihi_int *T = itemp; 97 opihi_int *V = vec[i][0].elements.Int; 98 I = index; 99 for (j = 0; j < Nval; j++, T++, I++) { 100 *T = V[*I]; 101 } 102 /* swap .elements.Flt (== V) and itemp */ 103 vec[i][0].elements.Int = itemp; 104 itemp = V; 51 105 } 52 /* swap .elements (== V) and temp */53 vec[i][0].elements = temp;54 temp = V;55 106 } 56 free (temp); 107 free (itemp); 108 free (ftemp); 57 109 free (vec); 58 110 free (index); … … 61 113 62 114 } 63 64
Note:
See TracChangeset
for help on using the changeset viewer.
