Bubble Sort Домашнее задание

Извините, для повторного старения старого вопроса, но это был первый вопрос / ответ «Переполнение стека», который появился в Google.

В этом сообщении (который впервые появился в Google) говорится об использовании более обновленного синтаксис PostgreSQL 10: https://blog.2ndquadrant.com/postgresql-10-identity-columns/

, который является:

CREATE TABLE test_new (
    id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
);

Надеюсь, что это помогает:)

128
задан Bill the Lizard 15 September 2012 в 02:34
поделиться

8 ответов

Чтобы объяснить, почему ваш сценарий не работает прямо сейчас, я Я переименую переменную unsorted в sorted .

Сначала ваш список не будет т еще не разобраны. Конечно, мы устанавливаем sorted на False .

Как только мы запускаем цикл while , мы предполагаем, что список уже отсортирован. Идея заключается в следующем: как только мы находим два элемента, которые находятся в неправильном порядке, мы возвращаем sorted обратно в False . sorted останется True только в том случае, если не было элементов в неправильном порядке .

sorted = False  # We haven't started sorting yet

while not sorted:
    sorted = True  # Assume the list is now sorted
    for element in range(0, length):
        if badList[element] > badList[element + 1]:
            sorted = False  # We found two elements in the wrong order
            hold = badList[element + 1]
            badList[element + 1] = badList[element]
            badList[element] = hold
    # We went through the whole list. At this point, if there were no elements
    # in the wrong order, sorted is still True. Otherwise, it's false, and the
    # while loop executes again.

Есть также небольшие небольшие проблемы, которые могут помочь сделать код более эффективным или читаемым.

  • В цикле for используется элемент переменной . Технически, элемент не является элементом; это число, представляющее индекс списка. Кроме того, это довольно долго. В этих случаях просто используйте имя временной переменной, например i для «индекса».

  • Команда range также может принимать только один аргумент (с именем stop ). В этом случае вы получите список всех целых чисел от 0 до этого аргумента.

     для i в диапазоне (длина):
    
  • В Руководстве по стилю Python рекомендуется, чтобы переменные назывались в нижнем регистре с подчеркиванием. Это очень незначительная придирка для такого маленького сценария; это больше для того, чтобы вы привыкли к тому, на что чаще всего похож код Python.

     def bubble (bad_list):
    
  • Чтобы поменять местами значения двух переменных, запишите их как присвоение кортежа. Правая часть оценивается как кортеж (скажем, (badList [i + 1], badList [i]) is (3, 5) ), а затем присваивается две переменные в левой части ( (badList [i], badList [i + 1]) ).

     bad_list [i], bad_list [i + 1] = bad_list [i + 1] , bad_list [i]
    

Сложите все вместе, и вы получите следующее:

my_list = [12, 5, 13, 8, 9, 65]

def bubble(bad_list):
    length = len(bad_list) - 1
    sorted = False

    while not sorted:
        sorted = True
        for i in range(length):
            if bad_list[i] > bad_list[i+1]:
                sorted = False
                bad_list[i], bad_list[i+1] = bad_list[i+1], bad_list[i]

bubble(my_list)
print my_list

(Я, кстати, удалил и ваш оператор печати.)

125
ответ дан 24 November 2019 в 00:40
поделиться

я рассматриваю добавление моего решения, потому что когда-либо решение здесь имеет

  1. большее время
  2. большая сложность пространства
  3. или делает слишком много, операции

тогда, должен быть

Так, вот мое решение:

<час>
def countInversions(arr):
    count = 0
    n = len(arr)
    for i in range(n):
        _count = count
        for j in range(0, n - i - 1):
            if arr[j] > arr[j + 1]:
                count += 1
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
        if _count == count:
            break
    return count
0
ответ дан 24 November 2019 в 00:40
поделиться

Ответы, предоставленные the-fury и Мартином Коте, исправили проблему бесконечного цикла, но мой код все равно будет работать некорректно (для большего списка он не будет правильно отсортирован). В итоге я отказался от несортированной переменной и вместо этого использовал счетчик.

def bubble(badList):
    length = len(badList) - 1
    n = 0
    while n < len(badList):
        for element in range(0,length):
            if badList[element] > badList[element + 1]:
                hold = badList[element + 1]
                badList[element + 1] = badList[element]
                badList[element] = hold
                n = 0
            else:
                n += 1
    return badList

if __name__ == '__main__':
    mylist = [90, 10, 2, 76, 17, 66, 57, 23, 57, 99]
    print bubble(mylist)

Если бы кто-нибудь мог предоставить какие-либо указатели на то, как улучшить мой код, в комментариях, это было бы очень полезно.

-1
ответ дан 24 November 2019 в 00:40
поделиться

У вас есть пара ошибок. Первый - по длине, а второй - в несортированном вами (как заявляет McWafflestix). Вы, вероятно, также захотите вернуть список, если собираетесь его распечатать:

mylist = [12, 5, 13, 8, 9, 65]

def bubble(badList):
    length = len(badList) - 2
    unsorted = True

    while unsorted:
        for element in range(0,length):
            unsorted = False

            if badList[element] > badList[element + 1]:
                hold = badList[element + 1]
                badList[element + 1] = badList[element]
                badList[element] = hold
                print badList
                unsorted = True

    return badList

print bubble(mylist)

eta: Вы правы, приведенное выше чертовски ошибочно. Плохо, что я не тестировал еще несколько примеров.

def bubble2(badList):
    swapped = True
    length = len(badList) - 2

    while swapped:
        swapped = False
        for i in range(0, length):
            if badList[i] > badList[i + 1]:

                # swap
                hold = badList[i + 1]
                badList[i + 1] = badList[i]
                badList[i] = hold

                swapped = True

    return badList
1
ответ дан 24 November 2019 в 00:40
поделиться
def bubble_sort(l):
    for passes_left in range(len(l)-1, 0, -1):
        for index in range(passes_left):
            if l[index] < l[index + 1]:
               l[index], l[index + 1] = l[index + 1], l[index]
    return l
4
ответ дан 24 November 2019 в 00:40
поделиться

Вы неправильно используете переменную Unsorted; вы хотите иметь переменную, которая сообщает вам, поменяли ли вы местами два элемента; если вы это сделали, вы можете выйти из цикла, в противном случае вам нужно будет снова выполнить цикл. Чтобы исправить то, что у вас здесь, просто поместите "unsorted = false" в тело вашего if case; удалите свой else case; и поместите "unsorted = true перед вашим для цикла ".

7
ответ дан 24 November 2019 в 00:40
поделиться

Вот что происходит, когда вы используете имя переменной с отрицательным значением, вам нужно инвертировать их значения. Было бы легче понять следующее:

sorted = False
while not sorted:
    ...

С другой стороны, логика алгоритма немного неверна. Вам нужно проверить, поменялись ли два элемента местами во время цикла for. Вот как бы я это написал:

def bubble(values):
    length = len(values) - 1
    sorted = False
    while not sorted:
        sorted = True
        for element in range(0,length):
            if values[element] > values[element + 1]:
                 hold = values[element + 1]
                 values[element + 1] = values[element]
                 values[element] = hold
                 sorted = False
    return values
8
ответ дан 24 November 2019 в 00:40
поделиться

Цель пузырьковой сортировки - перемещать более тяжелых элементов внизу в каждом раунде , при перемещении элементов зажигалок вверх. Во внутреннем цикле, где вы сравниваете элементы , вам не нужно перебирать весь список на каждом шаге . Самый тяжелый уже стоит последним. Переменная swapped является дополнительной проверкой, поэтому мы можем отметить, что список теперь отсортирован и избежать ненужных вычислений.

def bubble(badList):
    length = len(badList)
    for i in range(0,length):
        swapped = False
        for element in range(0, length-i-1):
            if badList[element] > badList[element + 1]:
                hold = badList[element + 1]
                badList[element + 1] = badList[element]
                badList[element] = hold
                swapped = True
        if not swapped: break

    return badList

Ваша версия 1, исправленная:

def bubble(badList):
    length = len(badList) - 1
    unsorted = True
    while unsorted:
        unsorted = False
        for element in range(0,length):
            #unsorted = False
            if badList[element] > badList[element + 1]:
                 hold = badList[element + 1]
                 badList[element + 1] = badList[element]
                 badList[element] = hold
                 unsorted = True
                 #print badList
             #else:
                 #unsorted = True

     return badList
10
ответ дан 24 November 2019 в 00:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: