Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Шейкерная сортировка на Python  (Прочитано 3564 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Шейкерная сортировка на Python
« : 29 Сентября 2015, 23:27:36 »
Подскажите пожалуйста почему не работает, нет времени в отладчике сидеть, сдавать скоро.
Код: (python) [Выделить]
__author__ = 'denis'
def swap(arr, i, j):
    temp = arr[i]
    arr[i] = arr[j]
    arr[j] = temp
arr = [5, 1, 3, 4, 7, 8, 9]
last = len(arr) - 1
left = 1
right = len(arr) - 1
while True:
  for i in range(right, left, -1):
      if(arr[i - 1] > arr[i]):
          swap(arr, i - 1, i)
          last = i
  left = last + 1
  for i in range(left, right, 1):
      if(arr[i - 1] > arr[i]):
          swap(arr, i - 1, i)
          last = i
  right = last - 1
  if(left <= right):
      break
Заранее спасибо.

Пользователь решил продолжить мысль [time]30 Сентябрь 2015, 00:50:58[/time]:
Написал по другому, тоже не работает
Код: (python) [Выделить]
__author__ = 'denis'
def swap(arr, i, j):
    temp = arr[i]
    arr[i] = arr[j]
    arr[j] = temp
arr = [5, 1, 3, 4, 7, 8, 9]
b = int(0)
lf = int(0)
rg = int(len(arr) - 1)
while lf < rg:
    for i in range(lf, rg, 1):
        if arr[i] > arr[i + 1]:
            b = i
            swap(arr, i, i + 1)
    rg = b
    if lf >= rg:
            break
    for i in rg(rg, lf, -1):
        if arr[i - 1] > arr[i]:
            b = i
            swap(arr, i, i - 1)
    lf = b

Пользователь решил продолжить мысль [time]30 Сентябрь 2015, 02:01:36[/time]:
И подскажите еще, что тут не так?
Код: (python) [Выделить]
__author__ = 'denis'
def swap(arr, i, j):
    temp = arr[i]
    arr[i] = arr[j]
    arr[j] = temp
arr = [5, 1, 3, 4, 7, 8, 9]
def quicksort(arr, start, end):
    i = start
    j = end
    mid = arr[int(start + (end - start) / 2)]
    while i < j:
        while arr[i] < mid:
            i += 1
        while arr[j] > mid:
            j += 1
        if i <= j:
            swap(arr, i, j)
            i += 1
            j -= 1
    if(start < j):
        quicksort(arr, start, j)
    if(i < end):
        quicksort(arr, i, end)
    return arr

arr2 = quicksort(arr, 0, len(arr) - 1)
« Последнее редактирование: 30 Сентября 2015, 01:02:20 от DenisVASI »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Шейкерная сортировка на Python
« Ответ #1 : 30 Сентября 2015, 12:23:36 »
Если бы ещё уточнили что именно не работает или какую ошибку выдает… К слову есть такие прекрасные функции как min|max… Надо ещё задуматься над оформлением: arr = … — это ввод данных, что он делает между определениями функций? И еще, Python позволяет делать вот такой фокус:
Код: (Python) [Выделить]
arr[i], arr[j] = arr[j], arr[i]
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Re: Шейкерная сортировка на Python
« Ответ #2 : 30 Сентября 2015, 14:08:33 »
Вроде ж не сессия ? куда спешить? :idiot2:

По делу:

1. рекурсия в алгаритмах сортировки очень редко может дать хоть какие-то преимущества, чаще рекурсия вносит ограничения связанные с глубиной стека.
2. Отладчик для питона особо не нужен - просто печатайте промежуточные состояния через print - и все будет понятно (тем более на таком маленьком примере).
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Шейкерная сортировка на Python
« Ответ #3 : 30 Сентября 2015, 15:07:24 »
Sly_tom_cat, может д/з задали. Рекурсия часто даёт улучшение читаемости. Разве питон не оптимизирует хвостовую рекурсию? Отладчик имхо лучше.
DenisVASI, без отладки ты не поймешь. Просмотри шаг за шагом каждую строку.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Re: Шейкерная сортировка на Python
« Ответ #4 : 30 Сентября 2015, 15:27:56 »
Не оптимизирует, обе сортировки писал на java, там все работает, что тут с ними произошло не знаю. 1 впадает в бесконечный цикл.
2 вовсе какую-то странную ошибку дает. в 3 почему-то выход за пределы массива

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Re: Шейкерная сортировка на Python
« Ответ #5 : 30 Сентября 2015, 16:04:01 »
2 - рабочий, просто сообщение об ошибке прочитайте внимательно и исправьте глупую ошибку в коде.
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Re: Шейкерная сортировка на Python
« Ответ #6 : 30 Сентября 2015, 17:55:29 »
Точно, спасибо) Плохая идея писать ночью)

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Re: Шейкерная сортировка на Python
« Ответ #7 : 01 Октября 2015, 12:17:47 »
Кстати, не совсем понятно зачем так много лишних телодвижений.
Код: (python) [Выделить]
arr = [5, 9, 7, 1, 3, 4, 8]
lf = 0
rg = len(arr) - 1
while lf < rg:
  for i in range(lf, rg, 1):
      if arr[i] > arr[i + 1]:
        rg = i
        arr[i], arr[i + 1] = arr[i + 1], arr[i]
  if lf < rg:
    for i in range(rg, lf, -1):
      if arr[i - 1] > arr[i]:
        lf = i
        arr[i], arr[i - 1] = arr[i - 1], arr[i]

print(arr)

В питоне то, что внутрь range передано снаружи можно смело менять.
« Последнее редактирование: 01 Октября 2015, 13:00:11 от Sly_tom_cat »
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

 

Страница сгенерирована за 0.084 секунд. Запросов: 25.