Нет. Ничего он не напутал. Учим матчасть, товарищ. Примерно выглядит так (r-вектор инверсий, f - искомая перестановка): Код (Text): for (i=0;i<n;++i) { f[i] = 0; } for (i=0;i<n;++i) { for (j=0,k=r[i]+1;k>0;++j) { if (f[j]==0) { --k; } } f[j] = i+1; } Конкретно не тестировал, так что вполне могу глючить Но суть алго такая: элементы перестановки просто расставляются на свои места. В самом начале везед стоят нули. А для того, чтобы определить положение i-го элемента перестановки (при просмотре от меньших номеров к большим) перед ним достаточно оставить r "нулей" и потом поставить его. Вот и все.
Суть понятна. Разве n не используется? И перебор идёт не от старших индексов? Понял. Я про "нули" сначала не додумался. СпасибО.
можно и в обратном порядке, но тогда перестановка строится не как массив, а как список, примерно так: [n], [n-1, n], [n-1, n-2, n], [n-1, n-2, n, n-3], ... при этом заранее неизвестно куда будут вставляться меньшие элементы.