... мне сказали, что это ужасный способ сделать что-то.
Прежде всего, не принимайте в качестве евангелия ничего, что вы слышите от случайных тел в Интернете(даже я).
Сортировка пузырьков штраф при определенных условиях, например, когда данные уже в основном отсортированы, или количество элементов относительно мало (например, 200) (a) , или у вас нет встроенной в язык функциональности сортировки, и вы находитесь в сжатые сроки, когда нехватка производительности будет раздражать клиента, а отсутствие функциональности приведет к увольнению: -)
Это смещение по отношению к пузырьковой сортировке аналогично правилам «только одна точка выхода из функции» и «нет перехода».Вы должны понять причину, стоящую за ними, чтобы вы знали, когда правила могут быть безопасно проигнорированы.
В любом случае, к собственно вопросу.Эффективный способ для вашего конкретного случая - просто посчитать элементы, а затем вывести их, что-то вроде:
dim count[1..5] = {0, 0, 0, 0, 0};
for each item in list:
count[item] = count[item] + 1
for val in 1..5:
for quant in 1..count[val]:
output val
Это решение O (n) времени и пространства O (1), и вы не найдетеболее эффективный big-O для обобщенной процедуры сортировки - в этом случае это возможно только из-за дополнительной информации о данных, имеющейся у вас (ограничена значениями от 1 до 5).
Если вы хотите проверить всеразличные алгоритмы сортировки, страница алгоритма сортировки в Википедии является полезной отправной точкой, включая основные алгоритмы и их свойства.
(a) В сторонуследующий код (использующий данные наихудшего случая для пузырьковой сортировки) при запуске под CygWin на не очень мощном ноутбуке IBM T60 (2 ГГц двухъядерный) завершается в среднем за 0,157 секунды (5 выборок: 0,150, 0,125,0,192, 0,199, 0,115).
Я бы не использовал его для сортировки миллиона предметов (все знают, что сортировка пузырьков плохо масштабируется), но в большинстве случаев 200 должно быть в порядке:
#include <stdio.h>
#define COUNT 200
int main (void) {
int i, swapped, tmp, item[COUNT];
// Set up worst case (reverse order) data.
for (i = 0; i < COUNT; i++)
item[i] = 200 - i;
// Slightly optimised bubble sort.
swapped = 1;
while (swapped) {
swapped = 0;
for (i = 1; i < COUNT; i++) {
if (item[i-1] > item[i]) {
tmp = item[i-1];
item[i-1] = item[i];
item[i] = tmp;
swapped = 1;
}
}
}
// for (i = 0; i < COUNT; i++)
// printf ("%d ", item[i]);
// putchar ('\n');
return 0;
}