Уведомления

Группа в Telegram: @pythonsu

#1 Май 25, 2015 16:58:54

jheniae
Зарегистрирован: 2014-09-18
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка списка с помощью radixsort

Здравствуйте. Помогите пожалуйста с задачей, условие следующее:
на вход дан массив длиной 1000 элементов, каждый элемент состоит из трех символов латиницы, в произвольном порядке. Задача отсортировать массив в алфавитном порядке с помощью алгоритма поразрядной сортировки в качестве внутреннего алгоритма следует использовать алгоритм сортировки подсчетом.

def CountingSort(A,k,d):
    B=[0]*len(A)
    C=[0]*(k)
    for j in range(0,len(A)):
        C[ord(A[j][d])-97]+=1
    for h in range(1,k):
        C[h]+=C[h-1]
    for i in range((len(A)-1),-1,-1):
        B[C[ord(A[i][d])-97]]=A[i]
        C[ord(A[i][d])-97]-=1
    return B
def RadixSort(A,d):
    arr=A
    for i in range(d-1,-1,-1):
        arr=CountingSort(arr,26,i)
    return arr
Мой код выдает ошибку " B[C[ord(A)-97]]=A
IndexError: list assignment index out of range" , уже бьюсь довольно много и не могу понять где происходит ошибка. Буде благодарен хоть за какой то намек. Спасибо.

Офлайн

#2 Май 25, 2015 17:16:46

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Сортировка списка с помощью radixsort

for j in range(0,len(A)-1):



Офлайн

#3 Май 25, 2015 17:35:36

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Сортировка списка с помощью radixsort

B[C[ord(i[d])-97]-1]=i
вот подумайте и все станет ясно почему нужно добавить -1
def CountingSort(A, k,  d):
    B = [0]*len(A)
    C = [0]*(k)
    for j in A:
        C[ord(j[d])-97] += 1
    for h in range(1, k):
        C[h] += C[h-1]
    for i in reversed(A):
        B[C[ord(i[d])-97]-1] = i
        C[ord(i[d])-97] -= 1
    return B
def RadixSort(A, d):
    arr = A
    for i in range(d-1, -1, -1):
        arr = CountingSort(arr, 26, i)
    return arr
немного ностальгии по reduce
def RadixSort(A, d):
    return reduce(lambda a, i: CountingSort(a, 26, i), range(d-1, -1, -1), A)



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Май 25, 2015 17:41:11)

Офлайн

#4 Май 25, 2015 19:00:30

jheniae
Зарегистрирован: 2014-09-18
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка списка с помощью radixsort

FishHook
for j in range(0,len(A)-1):
Но ведь тогда, элемент с индексом 999 не будет обрабатываться циклом.

Отредактировано jheniae (Май 25, 2015 19:09:51)

Офлайн

#5 Май 25, 2015 19:26:31

jheniae
Зарегистрирован: 2014-09-18
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка списка с помощью radixsort

terabayt
terabayt
вот подумайте и все станет ясно почему нужно добавить -1
Потому что список B имеет 1000 элементов а индексации начинается с нуля, правильно?

Офлайн

#6 Май 25, 2015 19:41:18

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Сортировка списка с помощью radixsort

jheniae
Потому что список B имеет 1000 элементов а индексации начинается с нуля, правильно?
потому что в В вы хотите хранить список с len(A) элементов но при этом не учитываете что C[ord(i)-97] никогда не будет равен 0
значит вы никогда не будете обращаться к нулевому элементу
нужно или создавать
B = len(A) + 1
и при этом откидывать первый элемент или делать как я сделал

работает мой вариант?
у меня работает
>>> def CountingSort(A, k, d):
...     B = [0]*len(A)
...     C = [0]*(k)
...     for j in A:
...         C[ord(j[d])-97] += 1
...     for h in range(1, k):
...         C[h] += C[h-1]
...     for i in reversed(A):
...         B[C[ord(i[d])-97]-1] = i
...         C[ord(i[d])-97] -= 1
...     return B
... 
>>> def RadixSort(A, d):
...     return reduce(lambda a, i: CountingSort(a, 26, i), range(d-1, -1, -1), A)
... 
>>> print RadixSort(['zbc', 'aol', 'acb'], 3)
['acb', 'aol', 'zbc']



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Май 25, 2015 19:42:15)

Офлайн

#7 Май 25, 2015 19:43:38

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Сортировка списка с помощью radixsort

jheniae
Потому что список B имеет 1000 элементов а индексации начинается с нуля, правильно?
Бинго!



Офлайн

#8 Май 26, 2015 12:35:27

jheniae
Зарегистрирован: 2014-09-18
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка списка с помощью radixsort

Спасибо огромное всем за помощь.
terabayt
Да действительно, я не учел, что цикл не присвоит значение с нулевым индексом. Спасибо за подсказку, теперь я понял, и все работает.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version