Проблема с реализацией алгоритма сортировки
Я пытаюсь научить себя нескольким алгоритмам сортировки в python, и у меня возникли небольшие проблемы с выводом. Я пытаюсь реализовать алгоритм сортировки подсчета, и я получил это далеко:
def counting_sort(l):
nums = l
highest = max(nums) + 1
helper_list = [0] * highest
s_list = []
for i in range(len(nums)):
value = nums[i]
helper_list[value] += 1
for j in range(len(helper_list)):
s_list.append([j] * helper_list[j])
return s_list
Все идет почти нормально, но когда я даю такой вклад, как [5, 2, 2, 3, 1, 2]
,
Я получаю вывод как: [[], [1], [2, 2, 2], [3], [5]]
,
2 ответа
Вы просто должны изменить "добавление" на "продлить". Функция добавления добавляет элемент в ваш список, в данном случае другой список. Функция extends объединяет ваш список с тем, который указан в качестве параметра.
Ваша функция должна быть такой:
def counting_sort(elements):
highest = max(elements) + 1
helper_list = [0] * highest
s_list = []
for value in elements:
helper_list[value] += 1
for j in range(len(helper_list)):
s_list.extend([j] * helper_list[j])
return s_list
def counting_sort(unordered_list, k, desc=False):
'''
unordered_list is the input array to be sorted.
k is the range of non-negative key values.
desc lets the algorithm to sort the array in descending order.
time complexity is the sum of the times for two steps, O(n + k).
'''
count_list = [0] * k
for element in unordered_list:
count_list[element] += 1
if desc:
enumerator = reversed(list(enumerate(count_list)))
else:
enumerator = enumerate(count_list)
sorted_list = []
for idx, count in enumerator:
sorted_list += [idx] * count
return sorted_list
Проблема в линии:
s_list.append([j] * helper_list[j])
Это говорит, чтобы добавить список ([j]*helper_list[j]
) чтобы s_list
добавив этот список в качестве нового элемента или s_list
,
Вместо этого вы хотите добавить один список в другой, что можно сделать так:
s_list.append += ([j] * helper_list[j])