00001 #include <parmetislib.h>
00002
00003
00004
00005 #define QSSWAP(a, b, stmp) do { stmp = (a); (a) = (b); (b) = stmp; } while (0)
00006
00007
00008
00009 #define MAX_THRESH 20
00010
00011
00012 typedef struct {
00013 idxtype *lo;
00014 idxtype *hi;
00015 } stack_node;
00016
00017
00018
00019 #define STACK_SIZE (8 * sizeof(unsigned long int))
00020 #define PUSH(low, high) ((void) ((top->lo = (low)), (top->hi = (high)), ++top))
00021 #define POP(low, high) ((void) (--top, (low = top->lo), (high = top->hi)))
00022 #define STACK_NOT_EMPTY (stack < top)
00023
00024
00025 void iidxsort(int total_elems, idxtype *pbase)
00026 {
00027 idxtype pivot, stmp;
00028
00029 if (total_elems == 0)
00030
00031 return;
00032
00033 if (total_elems > MAX_THRESH) {
00034 idxtype *lo = pbase;
00035 idxtype *hi = &lo[total_elems - 1];
00036 stack_node stack[STACK_SIZE];
00037 stack_node *top = stack + 1;
00038
00039 while (STACK_NOT_EMPTY) {
00040 idxtype *left_ptr;
00041 idxtype *right_ptr;
00042 idxtype *mid = lo + ((hi - lo) >> 1);
00043
00044
00045 if (*mid < *lo)
00046 QSSWAP(*mid, *lo, stmp);
00047 if (*hi < *mid)
00048 QSSWAP(*mid, *hi, stmp);
00049 else
00050 goto jump_over;
00051 if (*mid < *lo)
00052 QSSWAP(*mid, *lo, stmp);
00053
00054 jump_over:;
00055 pivot = *mid;
00056 left_ptr = lo + 1;
00057 right_ptr = hi - 1;
00058
00059
00060
00061
00062 do {
00063 while (*left_ptr < pivot)
00064 left_ptr++;
00065
00066 while (pivot < *right_ptr)
00067 right_ptr--;
00068
00069 if (left_ptr < right_ptr) {
00070 QSSWAP (*left_ptr, *right_ptr, stmp);
00071 left_ptr++;
00072 right_ptr--;
00073 }
00074 else if (left_ptr == right_ptr) {
00075 left_ptr++;
00076 right_ptr--;
00077 break;
00078 }
00079 } while (left_ptr <= right_ptr);
00080
00081
00082
00083
00084
00085
00086 if ((size_t) (right_ptr - lo) <= MAX_THRESH) {
00087 if ((size_t) (hi - left_ptr) <= MAX_THRESH)
00088
00089 POP (lo, hi);
00090 else
00091
00092 lo = left_ptr;
00093 }
00094 else if ((size_t) (hi - left_ptr) <= MAX_THRESH)
00095
00096 hi = right_ptr;
00097 else if ((right_ptr - lo) > (hi - left_ptr)) {
00098
00099 PUSH (lo, right_ptr);
00100 lo = left_ptr;
00101 }
00102 else {
00103
00104 PUSH (left_ptr, hi);
00105 hi = right_ptr;
00106 }
00107 }
00108 }
00109
00110
00111
00112
00113
00114
00115
00116 {
00117 idxtype *end_ptr = &pbase[total_elems - 1];
00118 idxtype *tmp_ptr = pbase;
00119 idxtype *thresh = (end_ptr < pbase + MAX_THRESH ? end_ptr : pbase + MAX_THRESH);
00120 register idxtype *run_ptr;
00121
00122
00123
00124
00125
00126
00127 for (run_ptr = tmp_ptr + 1; run_ptr <= thresh; run_ptr++)
00128 if (*run_ptr < *tmp_ptr)
00129 tmp_ptr = run_ptr;
00130
00131 if (tmp_ptr != pbase)
00132 QSSWAP(*tmp_ptr, *pbase, stmp);
00133
00134
00135 run_ptr = pbase + 1;
00136 while (++run_ptr <= end_ptr) {
00137 tmp_ptr = run_ptr - 1;
00138 while (*run_ptr < *tmp_ptr)
00139 tmp_ptr--;
00140
00141 tmp_ptr++;
00142 if (tmp_ptr != run_ptr) {
00143 idxtype elmnt = *run_ptr;
00144 idxtype *mptr;
00145
00146 for (mptr=run_ptr; mptr>tmp_ptr; mptr--)
00147 *mptr = *(mptr-1);
00148 *mptr = elmnt;
00149 }
00150 }
00151 }
00152 }