Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 29.12.2020
Сообщений: 7
1

Сортировка слиянием

30.10.2021, 12:37. Показов 1250. Ответов 5

Author24 — интернет-сервис помощи студентам
Всем здравствуйте, пытаюсь реализовать алгоритм сортировки массива, но не понимаю что в моем коде не верно.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def merge_sort(unsorted_list):
  if len(unsorted_list) == 1:
    return unsorted_list
  mid = len(unsorted_list) // 2
  left = merge_sort(unsorted_list[: mid])
  right = merge_sort(unsorted_list[mid :])
  return merge_sort_two(left, right)
 
def merge_sort_two(left, right):
  output_list = []
  i = j = 0
  while i < len(left) and j < len(right):
    if left[i] < right[j]:
      output_list.append(left[i])
      i += 1
    else:
      output_list.append(right[j])
      j += 1
  if i < len(left):
    output_list.append(left[i:])
  if j < len(right):
    output_list.append(right[j:])
  return output_list
Далее ошибка, которую я получаю на выходе:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
TypeError                                 Traceback (most recent call last)
 
<ipython-input-38-924c11ab5dbd> in <module>()
----> 1 merge_sort([6, 42, 15, 0, 4])
 
2 frames
 
<ipython-input-36-1d42e7dd7fd7> in merge_sort_two(left, right)
     11   i = j = 0
     12   while i < len(left) and j < len(right):
---> 13     if left[i] < right[j]:
     14       output_list.append(left[i])
     15       i += 1
 
TypeError: '<' not supported between instances of 'int' and 'list'
Мне кажется, что функция merge_sort работает не правильно, т.к. возвращает не два массива, а массив и другой массив с вложенным внутри массивом. Для этого пишу функцию merge_sort2, которая вернет левую и правую сторону, чтобы убедиться в моем предположении:
Python
1
2
3
4
5
6
7
def merge_sort2(unsorted_list):
  if len(unsorted_list) == 1:
    return unsorted_list
  mid = len(unsorted_list) // 2
  left = merge_sort2(unsorted_list[: mid])
  right = merge_sort2(unsorted_list[mid :])
  return left, right
Вывод:
Python
1
2
merge_sort2([6, 42, 15, 0, 4])
(([6], [42]), ([15], ([0], [4])))
Прошу подсказать в чем моя ошибка.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.10.2021, 12:37
Ответы с готовыми решениями:

Сортировка слиянием
Помогите, пожалуйста, с ошибкой File &quot;Untitled3.py&quot;, line 43, in &lt;module&gt; ...

Сортировка слиянием
Написать функцию, которая принимает на вход любой массив/список и выдает все промежуточные списки,...

Сортировка слиянием
Нужно создать код (сортировка слиянием). Подойдёт ли этот? def merge_sort(alist, start, end): ...

Сортировка слиянием
Помогите разобраться, почему не работает. Написал сортировку слиянием через 2 функции: одна...

Сортировка слиянием
Помогите пожалуйста! Нужно написать программу, выполняющую сортировку слиянием с описанием каждой...

5
Эксперт Python
4640 / 2056 / 363
Регистрация: 17.03.2012
Сообщений: 10,139
Записей в блоге: 6
30.10.2021, 14:05 2
Цитата Сообщение от Lightmourne Посмотреть сообщение
TypeError: '<' not supported between instances of 'int' and 'list'
Вам перевести с английского?
0
0 / 0 / 0
Регистрация: 29.12.2020
Сообщений: 7
30.10.2021, 15:49  [ТС] 3
Цитата Сообщение от dondublon Посмотреть сообщение
Вам перевести с английского?
Судя по ответу, читать до конца - это не про вас. Вопрос был о том почему я получаю в результате работы функции merge_sort2 не просто два итерируемых объекта без вложений, а объекты со вложенными списками и вложенными кортежами. А то что код не отработал из-за того что невозможно сравнить два объекта таких типов понятно любому. Обращаю ваше внимание, что тема была создано мной в разделе Python для начинающих, и я могу задавать любые вопросы которые не нарушают правила данного форума. А если же они кажутся настолько глупыми для вашего уровня, то я категорически не понимаю что вы ищете в данном разделе.
0
Эксперт Python
4640 / 2056 / 363
Регистрация: 17.03.2012
Сообщений: 10,139
Записей в блоге: 6
30.10.2021, 17:01 4
Lightmourne, всяко бывает, часто и глупые вопросы задают.
0
Эксперт Python
5434 / 3857 / 1215
Регистрация: 28.10.2013
Сообщений: 9,553
Записей в блоге: 1
30.10.2021, 17:27 5
Лучший ответ Сообщение было отмечено Lightmourne как решение

Решение

Lightmourne,

Python
1
2
3
4
5
6
7
    # дозаписываем остаток
    if i < len(left):
        out.extend(left[i:])
       
    # дозаписываем остаток
    if j < len(right):
        out.extend(right[j:])
И теперь погуглить: append vs extend.

Добавлено через 1 минуту
Либо:

Python
1
2
3
4
5
6
7
8
# дозаписываем остаток
    while i < len(left):
        out.append(left[i])
        i += 1
    # дозаписываем остаток
    while j < len(right):
        out.append(right[j])
        j += 1
Но это многанинужныхстрочек

Добавлено через 4 минуты
P.S. И еще - в коде беда с пробелами. Отступы должны быть в 4 пробела. Ставятся одним TAB c автозаменой.
1
0 / 0 / 0
Регистрация: 29.12.2020
Сообщений: 7
30.10.2021, 17:45  [ТС] 6
Цитата Сообщение от Garry Galler Посмотреть сообщение
И теперь погуглить: append vs extend.
Благодарю за ответ, это действительно то что мне и нужно было. Не имею ещё достаточного количества практики.
Цитата Сообщение от Garry Galler Посмотреть сообщение
Либо:
Python
1
2
3
4
5
6
7
8
# дозаписываем остаток
 while i < len(left):
 out.append(left[i])
 i += 1
 # дозаписываем остаток
 while j < len(right):
 out.append(right[j])
 j += 1
А вот до этого я дошел уже после того как задал мой вопрос на форуме, но этот вариант мне не понравился, т.к. он выглядит громоздким и снижает читаемость кода, как мне показалось.
Цитата Сообщение от Garry Galler Посмотреть сообщение
P.S. И еще - в коде беда с пробелами. Отступы должны быть в 4 пробела. Ставятся одним TAB c автозаменой.
А это косяк при копировании кода из моего ноутбука. Про соглашение по оформлению кода я знаю, и стараюсь его придерживаться. Ещё раз спасибо!
0
30.10.2021, 17:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.10.2021, 17:45
Помогаю со студенческими работами здесь

Сортировка слиянием
def merge(l: list, r: list): c = * (len(l) + len(r)) i = k = n = 0 while i &lt; len(l)...

Сортировка слиянием из файла
Нашел на просторах форума данный код и дополнил так, что бы он брал числа из файла def...

Сортировка слиянием (Merge sort)
Пытаюсь реализовать сортировку слиянием на python(без рекурсии, чтоб не запутаться). Вопрос: Как...

Сортировка слиянием на языке Питон
Помогите пожалуйста. Я никогда не работал с языком питон. помогите написать сортировку слиянием ...

Сортировка слиянием, описать каждый шаг
Условие: Метод сортировки слияние. Выводить каждый шаг: примерно так: print(f'Массив после {r} - ой...

Реализация сортировки слиянием по книге Т. Кормена
Я начинающий программист и не могу разобраться, что не так с алгоритмом. Все делал по книге...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru