template <class T>
void vector<T>::msd_sort(int ll, int rr, int dd, vector<int> vectc)
{
int l=ll;
int r1=10;
int i,j,maxa,ost,jj,del,cif;
r0=this->size()-1; //размер вектора
int r=rr;
int d=dd;
vector<int> count(r1+1);
maxa=vect[l];
if (d==1)
{
for (i=l;i<=r;i++)
{
if (vect>maxa)
{
maxa=vect;
}
} //находим максимальное значение в векторе
if (maxa==0)
k=1;
else
{
k=0;
while(maxa>=1)
{
k=k+1; //определяеям количество разрядов
maxa=maxa/10;
}
}
}
if (d>k) return;
for (j=0;j<r1;j++)
{
count[j]=0;
}
for (i=l;i<=r;i++)
{
ost=vect;
for (jj=1; jj<=d; jj++)
{
del=pow(10,k-jj);
cif=ost;
ost=fmod(ost,del);
cif=(cif-ost)/del;
}
j=cif;
count[j+1]=count[j+1]+1;
}
for (j=1;j<r1;j++)
{
count[j]=count[j]+count[j-1];
}
for (i=l;i<=r;i++)
{
ost=vect;
for (jj=1; jj<=d; jj++)
{
del=pow(10,k-jj);
cif=ost;
ost=fmod(ost,del);
cif=(cif-ost)/del;
}
j=cif; // это цифра в числе
vectc[count[j]]=vect;
count[j]=count[j]+1;
}
for (i=l;i<=r;i++)
{
if (vect==vectc[i-l])
{
com++; //вот момент истины 1
}
else
{
com++; //момент истины 2
ex++;
vect=vectc[i-l];
}
}
msd_sort(l, l+count[0]-1, d+1, vectc);
for (i=1;i<r1;i++)
{
if (count-1-count[i-1]>=1)
msd_sort(l+count[i-1], l+count-1, d+1, vectc);
}
};
оценка эффективности поразрядной MSD сортировки
Код:
алгоритм закоден с учебника, так что тут просто разобраться я думаю. но если есть вопросы, то поясню. завтра просто сдавать надо:confused: , а инфы никакой :(
смысл следующий: это код процедуры поразрядной MSD сортировки. перерыл кучу литературы в том числе и в инете, но толкового ответа так и не нашел. там в основном идут временные характеристики эффективности. в тестах использую целые числа (массив из целых). оценкой эффективности является число выполненных сравнений (com) и число обменов значениями(ex), ну и в итоге сумма. каждое из числа сравнений или обменов не на много отличается от n*LOG(n,10), но в сумме эта оценка превышает теоретическую в 2 раза. это первый момент. второй момент, когда я задаю вектор до 20000 элементов, и провожу тест по двум случаям : случайно заполненный вектор (натуральными) или упорядоченный вектор (по убыванию), то вроде как худший случай для алгоритма - это обратно упорядоченный(или нет?) дает чуть чуть бОльшие показатели, нежели у рандомного вектора, а вот начиная с 20000 и до 100000 размера упорядоченный вектор обрабатывается за меньшее количество сравнений и обменов. не могу понять логики, может кто-нить объяснить?