Как сделать следующую быструю сортировку более «питонической»

1

Я только что реализовал Quicksort в python-3, а следующее - выдержка для механизма подкачки, участвующего в каждом вспомогательном массиве.

Теперь я не могу не заметить, что это выглядит очень похоже на цикл на основе C. Это имеет смысл, так как я прихожу с долгого времени развития C++. Мне было интересно, можно ли сделать этот цикл более питоническим.

Я пытался использовать for items in array но это не полезно, так как итератор не должен увеличиваться для каждого раунда цикла.

Любые предложения приветствуются!

#  last elem is pivot at start
pivPos = end
#  iterate the list and bring pivot to correct position
count = 0

while (count != pivPos):

    #  swap places with elem just before pivot
    if arr[count] >= arr[pivPos]:
        temp = arr[count]
        arr[count] = arr[pivPos - 1]
        arr[pivPos - 1] = temp

        #  now swap the pivot
        arr[pivPos - 1] = arr[pivPos]
        arr[pivPos] = temp

        #  update pivPos
        pivPos -= 1

    else:
        count += 1
        continue
  • 1
    Истинный питонический путь называется «тимсорт»: P
  • 0
    Это выглядит отлично. Зверства были совершены во имя питоничности. Не пытайтесь делать это слишком.
Теги:
python-3.x
quicksort

1 ответ

3
Лучший ответ

Эта часть:

temp = arr[count]
arr[count] = arr[pivPos - 1]
arr[pivPos - 1] = temp
arr[pivPos - 1] = arr[pivPos]
arr[pivPos] = temp

может быть написано без temp:

arr[count], arr[pivPos-1], arr[pivPos] = arr[pivPos-1], arr[pivPos], arr[count]

Также continue является избыточным, его можно удалить, и код будет вести себя одинаково.

Однако реальный питонический путь:

arr.sort()

полный отредактированный код:

pivPos = end
count = 0
while count != pivPos:
    if arr[count] >= arr[pivPos]:
        arr[count], arr[pivPos-1], arr[pivPos] = arr[pivPos-1], arr[pivPos], arr[count]
        pivPos -= 1
    else:
        count += 1
  • 0
    Есть ли способ изменить тип цикла, чтобы сделать его более читабельным? Классические циклы while и for немного обескуражены в python.
  • 0
    Нет, мне это кажется довольно читабельным. Вы можете бросить парены в то же while .
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню