Дан список чисел, который может быть в любом порядке, например
3, -5, -1, 2, 7, 12, -8
Я хотел бы составить список, отражающий их ранг, который в данном случае будет
4, 1, 2, 3, 5, 6, 0
На самом деле числа являются некоторыми членами упорядоченного списка классов. Обратите внимание, что порядок в списке не меняется, они просто подсчитываются в соответствии с их рангом.
(эти числа представляют собой z-порядок, но могут быть и другие варианты использования)
Думаю, это - это тот же вопрос





Это мое решение, пока еще не опробованное:
// this will be our storage of the new z-order
int *tmpZ = new int[GetCount()];
int currentZ = INT_MIN;
int smallestIdx = -1;
int newZ = 0;
for (int passes = 0; passes < GetCount(); passes++)
{
int smallestZ = INT_MAX;
// find the index of the next smallest item
for (int i = 0; i < GetCount(); i++)
{
if (GetAt(i)->m_zOrder > currentZ && GetAt(i) < smallestZ)
{
smallestIdx = i;
smallestZ = GetAt(i)->m_zOrder;
}
}
tmpZ[smallestIdx] = newZ;
// prepare for the next item
currentZ = smallestZ;
newZ++;
smallestIdx = -1;
}
// push the new z-order into the array
for (int i = 0; i < GetCount(); i++)
GetAt(i)->m_zOrder = tmpZ[i];
Как видите, это O (n ^ 2) .... :(
что для тебя важно? время (мы могли бы отсортировать и настроить хеш)?