143 lines
2.5 KiB
C
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);
|
|
}
|
|
*/
|
|
/***************************************************************/
|