Если значения хранятся как последующие части большого массива, вы просто хотите отсортировать массив, а затем удалить последовательные значения, которые равны.
void SortAndDedupe(Array<T> a)
{
// Do an efficient in-place sort
a.Sort();
// Now deduplicate
int lwm = 0; // low water mark
int hwm = 1; // High water mark
while(hwm < a.length)
{
// If the lwm and hwm elements are the same, it is a duplicate entry.
if(a[lwm] == a[hwm])
{
hwm++;
}else{
// Not a duplicate entry - move the lwm up
// and copy down the hwm element over the gap.
lwm++;
if(lwm < hwm){
a[lwm] = a[hwm];
}
hwm++;
}
}
// New length is lwm
// number of elements removed is (hwm-lwm-1)
}
Прежде чем вы решите, что это будет слишком медленно, внедрите его и профилируйте. Это должно занять около десяти минут.
Редактировать: Это, конечно, можно улучшить, используя другой тип сортировки, а не встроенный, например, Quicksort, Heapsort или Smoothsort, в зависимости от того, что дает лучшую производительность на практике. Обратите внимание, что проблемы с аппаратной архитектурой означают, что практические сравнения производительности могут очень сильно отличаться от результатов анализа большого O.
На самом деле вам нужно профилировать его с помощью различных алгоритмов сортировки на вашей реальной аппаратной платформе / платформе ОС.
Примечание: В этом ответе я не пытаюсь дать академический ответ, я пытаюсь дать практический, исходя из предположения, что вы пытаетесь решить реальную проблему.