Учитывая большой массив, который имеет номера в диапазоне от 1 до 100. Каков наилучший подход к его сортировке?Интервью по алгоритму сортировки
Интервьюер выделял на слове диапазон т.е. максимальное количество, которое присутствует в массиве 100.
Учитывая большой массив, который имеет номера в диапазоне от 1 до 100. Каков наилучший подход к его сортировке?Интервью по алгоритму сортировки
Интервьюер выделял на слове диапазон т.е. максимальное количество, которое присутствует в массиве 100.
попробовать это:
long result[100] = {0};
for (iterator it = vec.begin(); it != vec.end(); ++it)
{
result[*it - 1]++;
}
Таким образом, вы будете двигаться линейные над вектором и подсчитайте все числа, которые существуют. В результате вы получите, сколько у вас было 1, сколько у вас было 2 и т. Д., То есть оно будет таким же отсортированным.
UPD: как KillianDS написал, я имею в виду counting sort. Это быстрый.
Может быть, они хотели услышать о radix sort.
Кажется, что подсчет сортировки является наиболее подходящим алгоритмом для этой проблемы, это O (n), стабильный и простой в реализации. http://en.wikipedia.org/wiki/Counting_sort
Ну, так как ответ был в основном дан, пример кода. Нет необходимости копировать данные из исходного массива; он может быть получен из данных в гистограмме, называется вариант алгоритма в разделе вики counting sort variant:
std::vector <size_t> hist(101, 0); // using index 1 to 100 inclusive
size_t i, j, n;
for (i = 0; i < vec.size(); i++)
hist[vec[i]]++;
i = 0;
for(j = 1; j <= 100; j++)
for(n = hist[j]; n; n--)
vec[i++] = j;
+1 Как сделать массив не менее 101, чтобы избежать 'hist [vec [i] -1] ++'; с массивом истории 100. Также полезно использовать 'size_t'. – chux
Является ли это экзамен для StackOverflow людей: D? что ты уже испробовал? – Claudix
Скорее всего, он намекает на что-то вроде [подсчет сортировки] (https://en.wikipedia.org/wiki/Counting_sort) – KillianDS
Я рекомендую подсчет сортировки, альтернативно, quicksort. – GingerPlusPlus