2014-08-25 2 views
-4

Учитывая большой массив, который имеет номера в диапазоне от 1 до 100. Каков наилучший подход к его сортировке?Интервью по алгоритму сортировки

Интервьюер выделял на слове диапазон т.е. максимальное количество, которое присутствует в массиве 100.

+2

Является ли это экзамен для StackOverflow людей: D? что ты уже испробовал? – Claudix

+2

Скорее всего, он намекает на что-то вроде [подсчет сортировки] (https://en.wikipedia.org/wiki/Counting_sort) – KillianDS

+1

Я рекомендую подсчет сортировки, альтернативно, quicksort. – GingerPlusPlus

ответ

1

попробовать это:

long result[100] = {0}; 

for (iterator it = vec.begin(); it != vec.end(); ++it) 
{ 
    result[*it - 1]++; 
} 

Таким образом, вы будете двигаться линейные над вектором и подсчитайте все числа, которые существуют. В результате вы получите, сколько у вас было 1, сколько у вас было 2 и т. Д., То есть оно будет таким же отсортированным.

UPD: как KillianDS написал, я имею в виду counting sort. Это быстрый.

0

Кажется, что подсчет сортировки является наиболее подходящим алгоритмом для этой проблемы, это O (n), стабильный и простой в реализации. http://en.wikipedia.org/wiki/Counting_sort

1

Ну, так как ответ был в основном дан, пример кода. Нет необходимости копировать данные из исходного массива; он может быть получен из данных в гистограмме, называется вариант алгоритма в разделе вики 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; 
+0

+1 Как сделать массив не менее 101, чтобы избежать 'hist [vec [i] -1] ++'; с массивом истории 100. Также полезно использовать 'size_t'. – chux

Смежные вопросы