Согласно wiki (см. Таблицу сравнения алгоритмов), мы должны использовать сортировку подсчета, потому что у нас не так много разных значений.
Во-первых, я полагал, что наши ценности Интс 0-100, и используется следующий код:
void sort(std::vector<int>& v)
{
double start = std::clock();
int* table = new int[MAX];
for (int i = 0; i < MAX; ++i)
{
table[i] = 0;
}
for (int i = 0; i < size; ++i)
{
++table[v[i]];
}
int cur = 0;
for (int i = 0; i < MAX; ++i)
{
for (int j = 0; j < table[i]; ++j)
{
v[cur++] = i;
}
}
delete[] table;
std::cout << "count sort over char array took " << (std::clock() - start)/CLOCKS_PER_SEC << " s" << std::endl;
}
Этот код принял 0.149s
на моем компьютере против 3.002s
используется std::sort
.
Это классическая реализация подсчета рода, но теперь пытаются ускорить его, удалить некоторые избыточные вычисления:
void sort6(int* v, int size)
{
double start = std::clock();
int* table = new int[MAX];
for (int i = 0; i < MAX; ++i)
{
table[i] = 0;
}
int* end = v + size;
for (int* vi = v; vi < end; ++vi)
{
++table[*vi];
}
int* cur = v;
for (int i = 0; i < MAX; ++i)
{
int count = table[i];
for (int j = 0; j < count; ++j)
{
*(cur++) = i;
}
}
std::cout << "count sort with pointers over char array took " << (std::clock() - start)/CLOCKS_PER_SEC << " s" << std::endl;
delete[] v;
delete[] table;
}
Это дает примерно 0.076s
.
Во-вторых, учитывая, что наши ценности не Интс 0-100, я использую следующий алгоритм:
- Найти все 101 различных номеров (с учетом равномерного распределения).
- Отсортируйте эти цифры.
- Поиск каждого из наших номеров 100000000 в этом массиве при выполнении сортировки.
К сожалению, на данный момент у меня нет времени для реализации этого и проверки, но я уверен, что ответ есть.
Я считаю, что вставка в карту деревьев будет самой быстрой, где каждое значение будет числом вставок заданного ключа. По сути, я предлагаю сортировку вставки для сжимаемых данных. – Bathsheba
Вы можете использовать 'unordered_map' в C++ для хэширования значений и поддержания количества каждого значения. –
Если вы используете древовидную карту, то вы получите бесплатную сортировку. – Bathsheba