#python #insertion-sort
#python #вставка-сортировка
Вопрос:
Мне нужно создать этот алгоритм вставки сортировки для uni, и у меня возникли проблемы с выяснением, почему выполнение этого кода дает «None».
Я бы хотел, чтобы она выдавала мне вывод в такой форме:
[Product(name='banana', price=3.99), Product(name='peanut butter', price=4.2), Product(name='jelly', price=5.99), Product(name='Phoebe Bridgers CD', price=8.2), Product(name='guitar strings', price=12)]
Мой код:
from typing import List
from dataclasses import dataclass
# dataclasses are a convenient new way to create simple "structs" or "records"
# in Python.
@dataclass
class Product:
name: str
price: float
# hint: lst is a python list, so use lst[i] to access element i
# (=what we called "get" in class), and use len(lst) to get its size.
# insertion sort
def sort_insertion(lst: List[Product]) -> List[Product]:
"""Sort lst by insertion, in-place."""
# We start from 1 since the first element is already sorted as it is.
for i in range(1, len(lst)):
cur_value = lst[i].price
cur_pos = i - 1
while cur_pos >= 0 and cur_value < lst[cur_pos].price:
lst[cur_pos 1].price = lst[cur_pos].price
cur_pos -= 1
lst[cur_pos 1].price = cur_value
sample_inventory = [
Product(name="banana", price=5.99),
Product(name="peanut butter", price=8.20),
Product(name="jelly", price=3.99),
Product(name="Phoebe Bridgers CD", price=12),
Product(name="guitar strings", price=4.20),
]
print(sort_insertion(sample_inventory))
Комментарии:
1. Ваш
sort_insertion()
метод ничего неreturn
делает.2. Спасибо!! Это решило проблему
Ответ №1:
Вот оно. Было три проблемы: 1. В первой строке цикла while вам нужно выполнить замену, как показано ниже. 2. вы хотите поменять местами весь продукт, а не только его цену. Вы не хотите, чтобы цена бананов и других товаров менялась в процессе сортировки. 3. Это сортировка in_place, поэтому вы не можете сказать print(sort_insertion(sample_inventory)), поскольку функция ничего не возвращает.
def sort_insertion(lst: List[Product]) -> List[Product]:
"""Sort lst by insertion, in-place."""
# We start from 1 since the first element is already sorted as it is.
for i in range(1, len(lst)):
cur_value = lst[i].price
cur_pos = i - 1
while cur_pos >= 0 and cur_value < lst[cur_pos].price:
lst[cur_pos 1], lst[cur_pos] = lst[cur_pos], lst[cur_pos 1]
cur_pos -= 1
lst[cur_pos 1].price = cur_value
sample_inventory = [
Product(name="banana", price=5.99),
Product(name="peanut butter", price=8.20),
Product(name="jelly", price=3.99),
Product(name="Phoebe Bridgers CD", price=12),
Product(name="guitar strings", price=4.20),
]
sort_insertion(sample_inventory)
print(sample_inventory)
#output:
[Product(name='jelly', price=3.99), Product(name='guitar strings', price=4.2), Product(name='banana', price=5.99), Product(name='peanut butter', price=8.2), Product(name='Phoebe Bridgers CD', price=12)]