Извините, для повторного старения старого вопроса, но это был первый вопрос / ответ «Переполнение стека», который появился в 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,
);
Надеюсь, что это помогает:)
Чтобы объяснить, почему ваш сценарий не работает прямо сейчас, я Я переименую переменную 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
(Я, кстати, удалил и ваш оператор печати.)
я рассматриваю добавление моего решения, потому что когда-либо решение здесь имеет
тогда, должен быть
Так, вот мое решение:
<час>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
Ответы, предоставленные 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)
Если бы кто-нибудь мог предоставить какие-либо указатели на то, как улучшить мой код, в комментариях, это было бы очень полезно.
У вас есть пара ошибок. Первый - по длине, а второй - в несортированном вами (как заявляет 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
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
Вы неправильно используете переменную Unsorted; вы хотите иметь переменную, которая сообщает вам, поменяли ли вы местами два элемента; если вы это сделали, вы можете выйти из цикла, в противном случае вам нужно будет снова выполнить цикл. Чтобы исправить то, что у вас здесь, просто поместите "unsorted = false" в тело вашего if case; удалите свой else case; и поместите "unsorted = true перед вашим для цикла
".
Вот что происходит, когда вы используете имя переменной с отрицательным значением, вам нужно инвертировать их значения. Было бы легче понять следующее:
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
Цель пузырьковой сортировки - перемещать более тяжелых элементов внизу в каждом раунде , при перемещении элементов зажигалок вверх. Во внутреннем цикле, где вы сравниваете элементы , вам не нужно перебирать весь список на каждом шаге . Самый тяжелый уже стоит последним. Переменная 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