2013-10-28 3 views
1

Я только что начал с изучения python сегодня. Это мой первый реальный язык программирования ... Я попытался сделать пузырь, но он всегда терпит неудачу. я не знаю, почему ...Bubblesort in Python 3.2

#!/usr/bin/python3.2 
import random; 

i = 0 
x = 100 
test = [] 

def createRandom(): 
     global i 
     global test 
     while i <= x: 
       test.extend([random.randrange(1,100)]); 
       i=i+1; 
     return test; 

def bubblesort(): 
     sorted=False; 
     while sorted!=True: 
       y = 0; 
       l = len(test)-1 
       print(l); 
       while y < l: 
         sorted=True; 
         if test[y]<test[y+1]: 
           tmp = test[y] 
           test[y]=test[y+1]; 
           test[y+1]=tmp; 
           y=y+1; 
           sorted=False; 


createRandom(); 
bubblesort(); 
print(test); 

Ошибка:

[email protected]:~/python3# ./bubblesort.py 
100 
^CTraceback (most recent call last): 
    File "./bubblesort.py", line 34, in <module> 
    bubblesort(); 
    File "./bubblesort.py", line 25, in bubblesort 
    if test[y]<test[y+1]: 
KeyboardInterrupt 

Спасибо за вашу помощь!

+0

Не на 100% уверен, но я думаю, что вы должны переместить 'sorted = True; 'во внешний цикл. Кроме того, ';' не нужно. –

+3

Вот совет - не используйте 'root' для запуска/тестирования/отладки вещей; используйте свою учетную запись пользователя. –

+1

Также переместите 'y = y + 1' из' if' –

ответ

2

Как уже отмечался в комментариях, есть две проблемы:

  • y=y+1 должны быть вне if заявления, в противном случае вы будете запускать в бесконечный цикл, как только есть два элементы в правильном порядке
  • sorted=True должен быть во внешнем контуре, в противном случае ваш вид остановится, если последние два элемента в списке в отсортированном порядке

Есть некоторые другие вещи, которые могут быть улучшены:

  • в Python, нет необходимости поставить ; после заявлений
  • вы можете сделать свопы как a, b = b, a, без использования временного переменного
  • дона «т использовать global переменные так много, лучше передавать их в качестве параметров
  • вместо while x < y: ... x=x+1 лучше использовать for x in range(y)
  • упорядоченном обычно от минимального до самого большого, поэтому вы должны использовать > вместо <
  • list comprehensions отличные вещи; прочитайте о них!

Собираем все вместе, упрощенная версия может выглядеть следующим образом:

import random 

def createRandom(): 
    return [random.randrange(1,100) for i in range(100)] 

def bubblesort(test): 
    is_sorted = False 
    while not is_sorted: 
     is_sorted= True 
     for y in range(len(test) - 1): 
      if test[y] > test[y+1]: 
       test[y], test[y+1] = test[y+1], test[y] 
       is_sorted= False 

lst = createRandom() 
bubblesort(lst) 
print(lst) 
+0

Это выглядело бы хорошо на [Code Review.SX] (http://codereview.stackexchange.com/). – ojdo

0
while y < l: 
    sorted=True; 
    if test[y]<test[y+1]: 
     tmp = test[y] 
     test[y]=test[y+1]; 
     test[y+1]=tmp; 
     y=y+1; 
     sorted=False; 

Вы только делаете y=y+1, если ваше утверждение IF верно!

Попробуйте положить y=y+1 за пределы if и он должен работать.

0

Есть два изменения, которые нужно сделать, в противном случае выглядит хорошо!

Как сказал тобиас, moev отсортировано = Истина за внутренней петлей. И вам нужно переместить y = y + 1 вне инструкции if.

#!/usr/bin/python3.2 
import random; 

i = 0 
x = 100 
test = [] 

def createRandom(): 
     global i 
     global test 
     while i <= x: 
       test.extend([random.randrange(1,100)]); 
       i=i+1; 
     return test; 

def bubblesort(): 
     sorted=False; 
     while sorted!=True: 
       y = 0; 
       l = len(test)-1 
       print(l); 
       sorted=True; 
       while y < l: 
         if test[y]<test[y+1]: 
           tmp = test[y] 
           test[y]=test[y+1]; 
           test[y+1]=tmp; 
           sorted=False; 
         y=y+1; 


createRandom(); 
bubblesort(); 
print(t) 
0

Разве это не лучший подход, чтобы завершить BubbleSort.

 
def bubbleSort(L): 

     for i in range(len(L)-1,0,-1): 
       for j in range(i): 
         if L[j]>L[j+1]: 
           temp=L[j] 
           L[j]=L[j+1] 
           L[j+1]=temp 

     print L 
    print "List Sorted . END!!" 
L=[4,5,6,7,2,3,8,7,9,6,7] 
bubbleSort(L) 

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