00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "dbl_eg_numutil.h"
00021
00022
00023
00024
00025
00026 void dbl_EGutilPermSort (const size_t sz,
00027 int *const perm,
00028 double * const elem)
00029 {
00030 size_t i,
00031 j,
00032 temp;
00033 double t;
00034 if (sz <= 1)
00035 return;
00036
00037 dbl_EGlpNumInitVar (t);
00038 EGswap (perm[0], perm[(sz - 1) / 2], temp);
00039 i = 0;
00040 j = sz;
00041 dbl_EGlpNumCopy (t, elem[perm[0]]);
00042 for (;;)
00043 {
00044 do
00045 i++;
00046 while (i < sz && dbl_EGlpNumIsLess (elem[perm[i]], t));
00047 do
00048 j--;
00049 while (dbl_EGlpNumIsLess (t, elem[perm[j]]));
00050 if (j < i)
00051 break;
00052 EGswap (perm[i], perm[j], temp);
00053 }
00054 EGswap (perm[0], perm[j], temp);
00055 dbl_EGlpNumClearVar (t);
00056 dbl_EGutilPermSort (j, perm, elem);
00057 dbl_EGutilPermSort (sz - i, perm + i, elem);
00058 }
00059
00060
00061 void dbl_EGutilPermSort2 (const size_t sz,
00062 int *const perm,
00063 double * const elem)
00064 {
00065 size_t i,
00066 j,
00067 temp;
00068 double t;
00069 if (sz <= 1)
00070 return;
00071
00072 dbl_EGlpNumInitVar (t);
00073 EGswap (perm[0], perm[(sz - 1) / 2], temp);
00074 i = 0;
00075 j = sz;
00076 dbl_EGlpNumCopy (t, elem[perm[0]]);
00077 for (;;)
00078 {
00079 do
00080 i++;
00081 while (i < sz && dbl_EGlpNumIsLess (t, elem[perm[i]]));
00082 do
00083 j--;
00084 while (dbl_EGlpNumIsLess (elem[perm[j]], t));
00085 if (j < i)
00086 break;
00087 EGswap (perm[i], perm[j], temp);
00088 }
00089 EGswap (perm[0], perm[j], temp);
00090 dbl_EGlpNumClearVar (t);
00091 dbl_EGutilPermSort2 (j, perm, elem);
00092 dbl_EGutilPermSort2 (sz - i, perm + i, elem);
00093 }
00094
00095
00096