Top.Mail.Ru
Ответы

Python помогите пожалуйста

По дате
По рейтингу
Аватар пользователя
Оракул
3мес
123456789
 input() 
cnt = [0] * 1001 
for n in map(int, input().split()): 
    cnt[n] += 1 
result = [] 
for i in range(1000, -1, -1): 
    if cnt[i]: 
        result.extend([i] * cnt[i]) 
print(*result) 

Или еще короче:

123
 input() 
nums = list(map(int, input().split())) 
print(*sorted(nums, reverse=True)) 


Первое решение более эффективно использует память, избегая создания промежуточных списков, а extend() работает быстрее чем sum() с вложенными списками.

Второе решение нахально простое, но с точки зрения семантики кода идеально передает суть задачи - "отсортировать в порядке убывания", и при этом выполняется за O(n log n), что для малых наборов данных будет даже быстрее чем сортировка подсчетом с обходом всех 1001 элементов.

Аватар пользователя
Высший разум
3мес

Сортировка подсчётом - это вот:

12345
 input() # кол-во чисел не нужно
cnt = [0] * 1001
for n in map(int, input().split()):
    cnt[n] += 1
print(' '.join(sum(([str(i)] * cnt[i] for i in range(len(cnt)-1, -1, -1)), []))) 


А ответ Зверева к сортировке подсчётом никакого отношения не имеет.

И кстати, в реальной жизни сортировка подсчётом используется, когда количество чисел намного превышает мощность множества их значений. Иначе обход массива частот убивает всю экономию пробегов по данным. В данном случае мы пробежим один раз N элементов и один раз - 1001 элемент.

В данном случае, когда диапазон значений в 10 раз превышает длину массива, лучше было бы использовать цифровую сортировку с основанием 32. В 4 прохода (2 чтения и 2 записи) любой массив данных был бы отсортирован, а длина массива частот была бы 32, а не 1001, как сейчас. Общее количество пройденных элементов было бы для N = 100: 4*100 + 4*32 = 528.

Библиотечная сортировка (обычно там используется сортировка Хоара или сортировка слиянием) сделает на 100 элементах порядка log2(100)=7 проходов, т.е. общая длина пробега - 700. Это меньше, чем для сортировки подсчётом (1001+100 = 1100), но больше, чем для цифровой. Правда при неудачном выборе опорных элементов пробегов будет больше.

Аватар пользователя
Мастер
3мес

x = int(input())
s = ''
arr = []
n = str(input())
a = list(n.split(' '))
a.sort()
for i in a:
s = s+i+' '
print(s)