Здравствуйте. Возникла такая задача: из массива N действительных чисел найти k-е число упорядоченной последовательности.
Пока я применил брутальное решение, основанное на предварительной сортировке:
// ys - сортируемый массив
.....................................
const int Lag[9]={1, 4, 10, 23, 57, 132, 301, 701, 1750};
int N=8, j, Lim;
double val;
if (nObs==1) return 0;
while (Lag[N] >= nObs) N--;
for (int ii=N; ii>=0; ii--)
{ Lim=Lag[ii];
for (int pos=Lim; pos < nObs; pos++)
{
val=*(ys+pos);
for (j=pos; j>=Lim; j-=Lim)
if (val<*(ys+j-Lim))
*(ys+j)=*(ys+j-Lim);
else
break;
*(ys+j)=val;
}
}
val=*(ys+k);
........................
Однако есть подозрение, что можно сделать эффективнее, т.к. сортировка всех элементов массива не требуется.
Видел соответствующие адаптации алгоритма quksort, но они меня не очень впечатлили, т.к. в том виде, как они есть - весьма неустойчивы и могут деградировать до
.
Хотелось бы обсудить, как это можно реализовать лучше, проще и эффективнее.