phigrape/debug.h
2019-08-25 16:22:03 +08:00

143 lines
2.5 KiB
C

/***************************************************************/
void d_swap(double *a, double *b)
{
register double tmp;
tmp = *a; *a = *b; *b = tmp;
}
void i_swap(int *a, int *b)
{
register int tmp;
tmp = *a; *a = *b; *b = tmp;
}
/***************************************************************/
/***************************************************************/
void my_sort(int l, int r, double *arr, int *ind)
{
int i, j, cikl;
double tmp;
i = l; j = r;
tmp = arr[(l+r)/2];
cikl = 1;
while (cikl)
{
while (arr[i]<tmp) i++;
while (tmp<arr[j]) j--;
if (i<=j)
{
d_swap(&arr[i],&arr[j]);
i_swap(&ind[i],&ind[j]);
i++; j--;
}
else
{
cikl = 0;
}
}
if (l<j) my_sort(l, j, arr, ind);
if (i<r) my_sort(i, r, arr, ind);
}
/***************************************************************/
/***************************************************************/
double my_select(int n_1, int n_2, int k, double *arr, int *ind)
{
int i, ir, j, l, mid, a_ind;
double a;
l = n_1;
ir = n_2;
for(;;)
{
if (ir <= l+1)
{
if (ir == l+1 && arr[ir] < arr[l])
{
d_swap(&arr[l],&arr[ir]);
i_swap(&ind[l],&ind[ir]);
}
return(arr[k]);
}
else
{
mid=(l+ir) >> 1;
d_swap(&arr[mid],&arr[l+1]);
i_swap(&ind[mid],&ind[l+1]);
if (arr[l+1] > arr[ir])
{
d_swap(&arr[l+1],&arr[ir]);
i_swap(&ind[l+1],&ind[ir]);
}
if (arr[l] > arr[ir])
{
d_swap(&arr[l],&arr[ir]);
i_swap(&ind[l],&ind[ir]);
}
if (arr[l+1] > arr[l])
{
d_swap(&arr[l+1],&arr[l]);
i_swap(&ind[l+1],&ind[l]);
}
i = l+1;
j = ir;
a = arr[l];
a_ind = ind[l];
for (;;)
{
do i++; while (arr[i] < a);
do j--; while (arr[j] > a);
if (j < i) break;
d_swap(&arr[i],&arr[j]);
i_swap(&ind[i],&ind[j]);
}
arr[l] = arr[j];
ind[l] = ind[j];
arr[j] = a;
ind[j] = a_ind;
if (j >= k) ir = j-1;
if (j <= k) l = i;
}
}
}
/***************************************************************/
/***************************************************************/
/*
double lagrange_radius(double percent)
{
int Nb;
double tmp;
Nb = (int)(percent * N);
my_sort(0, N-1, d, ind);
tmp = my_select(0, N-1, Nb-1, d, ind); d[Nb-1] = tmp;
return(tmp);
}
*/
/***************************************************************/