Решение задачи Поразрядная сортировка с Яндекс Контест

Без пояснения   Просмотров: 1397


Поразрядная сортировка является одним из видов сортировки, которые работают за линейное от размера сортируемого массива время. Такая скорость достигается за счет того, что эта сортировка использует внутреннюю структуру сортируемых объектов. Изначально этот алгоритм использовался для сортировки перфокарт. Первая его компьютерная реализация была создана в университете MIT Гарольдом Сьюардом (Harold Н. Seward). Опишем алгоритм подробнее. Пусть задан массив строк s 1 , ..., s i причем все строки имеют одинаковую длину m . Работа алгоритма состоит из m фаз. На i -ой фазе строки сортируются па i -ой с конца букве. Происходит это следующим образом. Будем, для простоты, в этой задаче рассматривать строки из цифр от 0 до 9. Для каждой цифры создается «корзина» («bucket»), после чего строки s i распределяются по «корзинам» в соответствии с i -ой с конца цифрой. Строки, у которых i -ая с конца цифра равна j попадают в j -ую корзину (например, строка 123 на первой фазе попадет в третью корзину, на второй — во вторую, на третьей — в первую). После этого элементы извлекаются из корзин в порядке увеличения номера корзины. Таким образом, после первой фазы строки отсортированы по последней цифре, после двух фаз - по двум последним, ..., после m фаз - по всем. При важно, чтобы элементы в корзинах сохраняли тот же порядок, что и в исходном массиве (до начала этой фазы). Например, если массив до первой фазы имеет вид: 111,112,211, 311, то элементы по корзинам распределятся следующим образом: в первой корзине будет. 111,211,311, а второй: 112. Ваша задача состоит в написании программы, детально показывающей работу этого алгоритма на заданном массиве.


Код

n = int(input())
dict = {}
print("Initial array:")
for i in range(10):
    dict[str(i)] = []
k = 1
mx = 0
for i in range(n):
    s = input()
    mx = len(s)
    if i == n - 1:
        print(s)
    else:
        print(s, end=", ")
    dict[s[-1]] += [s]
print("**********")
nd = {}
for i in range(mx):
    for j in range(10):
        nd[str(j)] = []
    print("Phase", i + 1)
    for j in dict:
        for h in dict[j]:
            # print(h)
            # print(str(h[-2]))
            nd[str(h[-i-1])] += [h]
            # print('nd ', nd)
    for i in nd:
        dict[i] = nd[i]
    # print(dict)
    for j in range(10):
        j = str(j)
        print("Bucket ", j, ": ", end="", sep="")
        if len(dict[j]) == 0:
            print('empty')
        else:
            for h in range(len(dict[j])):
                if h == len(dict[j]) - 1:
                    print(dict[j][h])
                else:
                    print(dict[j][h], ', ', end="", sep="")

    print("**********")

print('Sorted array:')
res = ''
for i in dict:
    for j in dict[i]:
        res += j + ', '
print(res[:-2])

         

Администратор Photo Автор: Администратор



Комментарии

Чтобы написать комментарии вам нужно войти в систему или зарегистрироваться



Заявка на расчет