Форум сайта python.su
Здравствуйте. Помогите пожалуйста с задачей, условие следующее:
на вход дан массив длиной 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
Офлайн
for j in range(0,len(A)-1):
Офлайн
B[C[ord(i[d])-97]-1]=i
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
def RadixSort(A, d): return reduce(lambda a, i: CountingSort(a, 26, i), range(d-1, -1, -1), A)
Отредактировано terabayt (Май 25, 2015 17:41:11)
Офлайн
FishHookНо ведь тогда, элемент с индексом 999 не будет обрабатываться циклом.
for j in range(0,len(A)-1):
Отредактировано jheniae (Май 25, 2015 19:09:51)
Офлайн
terabayt
terabaytПотому что список B имеет 1000 элементов а индексации начинается с нуля, правильно?
вот подумайте и все станет ясно почему нужно добавить -1
Офлайн
jheniaeпотому что в В вы хотите хранить список с len(A) элементов но при этом не учитываете что C[ord(i)-97] никогда не будет равен 0
Потому что список B имеет 1000 элементов а индексации начинается с нуля, правильно?
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']
Отредактировано terabayt (Май 25, 2015 19:42:15)
Офлайн
jheniaeБинго!
Потому что список B имеет 1000 элементов а индексации начинается с нуля, правильно?
Офлайн
Спасибо огромное всем за помощь.
terabayt
Да действительно, я не учел, что цикл не присвоит значение с нулевым индексом. Спасибо за подсказку, теперь я понял, и все работает.
Офлайн