Bong bóng sắp xếp bài tập về nhà


130

Trong lớp, chúng tôi đang thực hiện các thuật toán sắp xếp và mặc dù tôi hiểu chúng rất tốt khi nói về chúng và viết mã giả, tôi gặp vấn đề khi viết mã thực tế cho chúng.

Đây là nỗ lực của tôi trong Python:

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

def bubble(badList):
    length = len(badList) - 1
    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
            else:
                unsorted = True

print bubble(mylist)

Bây giờ, điều này (theo như tôi có thể nói) sắp xếp chính xác, nhưng một khi nó hoàn thành, nó chỉ lặp lại vô thời hạn.

Làm thế nào mã này có thể được sửa chữa để chức năng kết thúc đúng và sắp xếp chính xác một danh sách bất kỳ kích thước (hợp lý)?

Tái bút: Tôi biết rằng tôi không thực sự có các bản in trong một chức năng và tôi nên trả lại, nhưng tôi vẫn chưa làm điều đó vì mã của tôi chưa thực sự hoạt động.


29
@KM - Anh ấy có nên lấy bãi cỏ của bạn không?
Aiden Bell

123
Bài viết về cơ bản là: "Tôi gặp khó khăn khi viết mã, đây là những gì tôi đã làm, nó không hoạt động." Rõ ràng có một ẩn ý "Ai đó có thể cho tôi một vài gợi ý không?" Không giống như nhiều câu hỏi bài tập về nhà, câu hỏi này (a) được viết tốt, (b) thẳng thắn về việc làm bài tập về nhà và (c) bao gồm một nỗ lực tốt để giải quyết vấn đề. Tôi không nghĩ việc thiếu một dấu hỏi thực tế làm giảm quá nhiều ..
John Fouhy

36
Sắp xếp bong bóng được sử dụng như một công cụ học tập vì đó là thuật toán sắp xếp dễ nhất cho hầu hết mọi người để hiểu. Đó là một điểm khởi đầu tốt để tìm hiểu về sắp xếp và thuật toán nói chung. Nếu chúng ta chỉ dạy những thứ mà mọi người thực sự sẽ sử dụng, cuộc thảo luận về sắp xếp sẽ bắt đầu và kết thúc bằng "sử dụng thói quen sắp xếp thư viện".
Bill Lizard

38
Câu hỏi này là một đứa trẻ áp phích cho cách đặt câu hỏi "bài tập về nhà" tốt. Theo quan điểm của John Fouhy, có một mẫu mã, nó được viết rất tốt và người đăng đang cố gắng hết sức để giúp chúng tôi dễ dàng giúp đỡ. Làm tốt lắm, joshhunt.
Jarret Hardie

20
Sắp xếp bong bóng không phải là một thuật toán sắp xếp dễ dàng để mọi người hiểu. Từ kinh nghiệm của bản thân và kinh nghiệm giảng dạy, tôi có thể tự tin nói rằng sắp xếp chèn, sắp xếp lựa chọn, sắp xếp tối thiểu (sắp xếp phần tử tối thiểu), thậm chí (đối với một số học sinh) sáp nhập và quicksort dễ hiểu hơn - sau tất cả, chúng tương ứng với phần nào cách tự nhiên để sắp xếp một danh sách, nhưng sắp xếp bong bóng chỉ là giả tạo. Hơn nữa, sắp xếp bong bóng dễ xảy ra nhiều lỗi khác nhau và lỗi vòng lặp vô hạn, như câu hỏi này ở đây. Như Knuth nói, "loại bong bóng dường như không có gì để giới thiệu, ngoại trừ một cái tên hấp dẫn ..."
ShreevatsaR

Câu trả lời:


127

Để giải thích tại sao tập lệnh của bạn không hoạt động ngay bây giờ, tôi sẽ đổi tên biến unsortedthành sorted.

Lúc đầu, danh sách của bạn chưa được sắp xếp. Tất nhiên, chúng tôi đặt sortedra False.

Ngay khi chúng tôi bắt đầu whilevòng lặp, chúng tôi giả định rằng danh sách đã được sắp xếp. Ý tưởng là thế này: ngay khi chúng tôi tìm thấy hai yếu tố không theo đúng thứ tự, chúng tôi đặt sortedlại False. sortedsẽ True chỉ còn lại nếu không có yếu tố nào theo thứ tự sai .

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.

Ngoài ra còn có một số vấn đề nhỏ sẽ giúp mã hiệu quả hơn hoặc dễ đọc hơn.

  • Trong forvòng lặp, bạn sử dụng biến element. Về mặt kỹ thuật, elementkhông phải là một yếu tố; đó là một con số đại diện cho một chỉ mục danh sách. Ngoài ra, nó khá dài. Trong những trường hợp này, chỉ cần sử dụng một tên biến tạm thời, như icho "index".

    for i in range(0, length):
  • Các rangelệnh cũng có thể chỉ mất một đối số (tên stop). Trong trường hợp đó, bạn nhận được một danh sách tất cả các số nguyên từ 0 đến đối số đó.

    for i in range(length):
  • Các Python Style Guide khuyến cáo rằng các biến có tên trong chữ thường với dấu gạch dưới. Đây là một nitlog rất nhỏ cho một kịch bản nhỏ như thế này; sẽ tốt hơn nếu bạn quen với những gì mã Python thường giống nhất.

    def bubble(bad_list):
  • Để hoán đổi các giá trị của hai biến, hãy viết chúng dưới dạng gán tuple. Phía bên tay phải được đánh giá là một tuple (giả sử (badList[i+1], badList[i])(3, 5)) và sau đó được gán cho hai biến ở phía bên trái ( (badList[i], badList[i+1])).

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

Đặt tất cả lại với nhau, và bạn nhận được điều này:

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

(Nhân tiện, tôi cũng xóa câu lệnh in của bạn.)


1
Chỉ trên đoạn mã cuối cùng đó, bong bóng không trả về bất cứ thứ gì, vì vậy kết quả cuối cùng là 'Không' được in. Bạn có thể muốn trả về danh sách hoặc thực hiện bong bóng (my_list) và sau đó in my_list.
Tung Nguyễn

9
+1 có cấu trúc tốt, lời khuyên rõ ràng. Thật tuyệt khi thấy bạn dẫn người đọc đi qua những gì bạn đã làm và tại sao thay vì chỉ viết một bản sửa lỗi nhanh.
Tom Leys

1
Tôi là một lập trình viên C #, vì vậy điều này có thể là do tôi không có Python, nhưng bạn không cần một cái gì đó trong vòng lặp while để trừ đi 1 chiều dài để có được thuật toán sắp xếp bong bóng bình thường?
Martin Brown

20
Đây là một triển khai ngây thơ (nhưng không chính xác) của Bubble Sort. Sau mỗi lần lặp của whilevòng lặp, phần tử lớn nhất sẽ "nổi bong bóng" đến cuối danh sách. Như vậy, sau một lần lặp, phần tử cuối cùng chắc chắn được đặt đúng chỗ (và sẽ không bị di chuyển bởi các lần lặp kế tiếp). Bằng cách trừ 1 từ chiều dài, bạn đang tối ưu hóa thuật toán bằng cách chỉ sắp xếp danh sách con chưa được sắp xếp (các length-nyếu tố trên cùng của danh sách). Tôi đã chọn bỏ qua tối ưu hóa này, vì nó là một tối ưu hóa hơn là một phần quan trọng của thuật toán.
Wesley

2
Put it all together, and you get this:... tốt, bạn đã bỏ lỡ cái này:The range command can also take just one argument (named stop).
Peter Perháč

10

Mục tiêu của sắp xếp bong bóng là để di chuyển các vật nặng hơn ở dưới cùng trong mỗi vòng, trong khi di chuyển các vật nhẹ hơn lên. Trong vòng lặp bên trong, nơi bạn so sánh các yếu tố, bạn không phải lặp lại toàn bộ danh sách trong mỗi lượt . Các nặng nhất đã được đặt trước. Các hoán đổi biến là một kiểm tra thêm vì vậy chúng tôi có thể đánh dấu rằng danh sách này hiện đang được sắp xếp và tránh tiếp tục với các tính toán cần thiết.

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

Phiên bản 1 của bạn, đã sửa:

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

8

Đây là những gì xảy ra khi bạn sử dụng tên biến có nghĩa tiêu cực, bạn cần đảo ngược các giá trị của chúng. Sau đây sẽ dễ hiểu hơn:

sorted = False
while not sorted:
    ...

Mặt khác, logic của thuật toán là một chút tắt. Bạn cần kiểm tra xem hai phần tử được hoán đổi trong vòng lặp for. Đây là cách tôi sẽ viết nó:

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

1
Thật là hơi tệ khi không có nút "SAU" mà tôi có thể nhấn cho câu trả lời này. Tôi nghĩ rằng câu hỏi này và các câu trả lời - và đặc biệt là việc bỏ phiếu - cần được nêu ra vào lần tới khi Joel Spolsky nói về việc anh ấy điều chỉnh các tương tác xã hội trên stackoverflow tốt như thế nào.
Daniel Martin

@Daniel: bạn có thể làm những gì người khác có đủ danh tiếng (100) có thể làm - hạ thấp câu trả lời sai. Có một mầm của sự thật - điều kiện phủ định được ghi nhận trong các biến cờ là xấu. Tuy nhiên, đó không phải là toàn bộ câu trả lời - tôi nghĩ @McWafflestix đã đúng.
Jonathan Leffler

2
Các bạn nói đúng, tôi đã trả lời sớm về điều này. Xin lỗi vì điều đó.
Martin Côte

2
@Martin - và tôi nên chỉ ra rằng tôi ngạc nhiên / sốc hơn khi bỏ phiếu hơn là câu trả lời. Hệ thống danh tiếng khuyến khích bạn có được câu trả lời đầu tiên ngay lập tức. Phần bị hỏng là cách một câu trả lời không chính xác được bình chọn.
Daniel Martin

2
Tôi nghi ngờ rằng hầu hết mọi người bỏ phiếu mà không thực sự hiểu câu hỏi ngay từ đầu (giống như cách tôi trả lời câu hỏi). OTOH, người đặt câu hỏi có đặc quyền chọn câu trả lời 'đúng' sau đó.
Martin Côte

7

Việc bạn sử dụng biến Unsort là sai; bạn muốn có một biến cho bạn biết nếu bạn đã hoán đổi hai yếu tố; nếu bạn đã làm điều đó, bạn có thể thoát khỏi vòng lặp của mình, nếu không, bạn cần phải lặp lại. Để khắc phục những gì bạn đã có ở đây, chỉ cần đặt "unsort = false" trong phần thân của trường hợp nếu bạn; loại bỏ trường hợp khác của bạn; và đặt "unsort = true trước forvòng lặp của bạn .


5
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

1
Tôi tin rằng câu hỏi nằm dọc theo dòng 'Làm thế nào mã này có thể được sửa', chứ không phải 'sắp xếp bong bóng của bạn là gì?'
Josh Hunt

4
bạn hoàn toàn đúng, nhưng thực hiện nó đúng cách còn quan trọng hơn
mtasic85

6
Đúng, có lẽ, mtasic ... nhưng bất cứ điều gì được gắn thẻ là bài tập về nhà đều được điều chỉnh một cách có hướng dẫn hơn là được viết lại (đặc biệt là khi nó được OP gắn thẻ là bài tập về nhà).
Jarret Hardie

1
Đây là một bản viết lại hoàn hảo của sách giáo khoa C sắp xếp bong bóng hầu hết mọi người nghiên cứu. Tôi đã viết như vậy.
Lakshman Prasad

2
thêm thông tin tốt là hữu ích trong quan điểm của tôi. Vì vậy, câu trả lời tốt .. mặc dù bạn có thể sử dụng cờ để phá vỡ sớm nhất có thể.
Grijesh Chauhan

3

# Một chức năng rất đơn giản, có thể được tối ưu hóa (rõ ràng) bằng cách giảm không gian vấn đề của mảng thứ 2. Nhưng cùng độ phức tạp O (n ^ 2).

def bubble(arr):
    l = len(arr)        
    for a in range(l):
        for b in range(l-1):
            if (arr[a] < arr[b]):
            arr[a], arr[b] = arr[b], arr[a]
    return arr 

Đó là một chút ít tin tưởng vào cách bạn có thể trao đổi các giá trị trong Python: arr[a], arr[b] = arr[b], arr[a]
Makoto

1

Bạn đã có một vài lỗi trong đó. Đầu tiên là chiều dài và thứ hai là trong việc bạn sử dụng chưa được sắp xếp (như đã nêu của McWafflestix). Bạn cũng có thể muốn trả về danh sách nếu bạn sẽ in nó:

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: Bạn nói đúng, ở trên là lỗi như địa ngục. Xấu của tôi không kiểm tra thông qua một số ví dụ.

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

Không nên "không sắp xếp = Sai" nằm ngoài vòng lặp for?
Svante

Nó có một vài vấn đề hơn thế;)
Trevor Oke

1

Tôi là một người mới bắt đầu mới, bắt đầu đọc về Python ngày hôm qua. Lấy cảm hứng từ ví dụ của bạn, tôi đã tạo ra một cái gì đó có thể nhiều hơn trong phong cách 80 mối quan hệ, nhưng tuy nhiên nó vẫn hoạt động

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

i=0
while i < len(lista1)-1:
    if lista1[i] > lista1[i+1]:
        x = lista1[i]
        lista1[i] = lista1[i+1]
        lista1[i+1] = x
        i=0
        continue
    else:
        i+=1

print(lista1)

1

Vấn đề với thuật toán ban đầu là nếu bạn có số thấp hơn nữa trong danh sách, nó sẽ không đưa nó đến vị trí được sắp xếp chính xác. Chương trình cần quay lại từ đầu mỗi lần để đảm bảo rằng các con số sắp xếp hoàn toàn.

Tôi đã đơn giản hóa mã và bây giờ nó sẽ hoạt động cho bất kỳ danh sách số nào bất kể danh sách và ngay cả khi có các số lặp lại. Đây là mã

mylist = [9, 8, 5, 4, 12, 1, 7, 5, 2]
print mylist

def bubble(badList):
    length = len(badList) - 1
    element = 0
    while element < length:
        if badList[element] > badList[element + 1]:
            hold = badList[element + 1]
            badList[element + 1] = badList[element]
            badList[element] = hold
            element = 0
            print badList
        else:
            element = element + 1

print bubble(mylist)

1
def bubble_sort(l):
    exchanged = True
    iteration = 0
    n = len(l)

    while(exchanged):
        iteration += 1
        exchanged = False

        # Move the largest element to the end of the list
        for i in range(n-1):
            if l[i] > l[i+1]:
                exchanged = True
                l[i], l[i+1] = l[i+1], l[i]
        n -= 1   # Largest element already towards the end

    print 'Iterations: %s' %(iteration)
    return l

1
Bong bóng phần tử lớn hơn cho đến cuối. Và giảm bộ đếm kết thúc, "n" để bạn không phải so sánh lại. Tiếp tục với vòng lặp while miễn là có trao đổi. Trường hợp xấu nhất: O (N ^ 2) Trường hợp tốt nhất: O (N)
Zile Rehman

1
def bubbleSort(alist):
if len(alist) <= 1:
    return alist
for i in range(0,len(alist)):
   print "i is :%d",i
   for j in range(0,i):
      print "j is:%d",j
      print "alist[i] is :%d, alist[j] is :%d"%(alist[i],alist[j])
      if alist[i] > alist[j]:
         alist[i],alist[j] = alist[j],alist[i]
return alist

alist = [54,26,93,17,77,31,44,55,20, -23, -34,16,11,11,11]

in bubbleSort (alist)


Vui lòng thụt lề mẫu mã của bạn một cách chính xác: tất nhiên, điều này đặc biệt quan trọng trong Python. Bạn cũng có thể muốn giải thích lý do tại sao giải pháp của bạn đáng để xem xét cũng có câu trả lời với 100 phiếu bầu
kdopen 16/2/2015

1
def bubble_sort(a):
    t = 0
    sorted = False # sorted = False because we have not began to sort
    while not sorted:
    sorted = True # Assume sorted = True first, it will switch only there is any change
        for key in range(1,len(a)):
            if a[key-1] > a[key]:
                sorted = False
                t = a[key-1]; a[key-1] = a[key]; a[key] = t;
    print a

1

Một ví dụ đơn giản hơn:

a = len(alist)-1
while a > 0:
    for b in range(0,a):
        #compare with the adjacent element
        if alist[b]>=alist[b+1]:
            #swap both elements
            alist[b], alist[b+1] = alist[b+1], alist[b]
    a-=1

Điều này chỉ đơn giản là lấy các phần tử từ 0 đến a (về cơ bản, tất cả các phần tử chưa được sắp xếp trong vòng đó) và so sánh nó với phần tử liền kề của nó và thực hiện hoán đổi nếu nó lớn hơn phần tử lân cận. Vào cuối vòng, phần tử cuối cùng được sắp xếp và quá trình chạy lại mà không có nó, cho đến khi tất cả các phần tử đã được sắp xếp.

Không cần một điều kiện cho dù sortlà đúng hay không.

Lưu ý rằng thuật toán này sẽ xem xét vị trí của các số chỉ khi hoán đổi, vì vậy các số lặp lại sẽ không ảnh hưởng đến nó.

Tái bút Tôi biết đã rất lâu kể từ khi câu hỏi này được đăng, nhưng tôi chỉ muốn chia sẻ ý tưởng này.


1
arr = [5,4,3,1,6,8,10,9] # array not sorted

for i in range(len(arr)):
    for j in range(i, len(arr)):
        if(arr[i] > arr[j]):
            arr[i], arr[j] = arr[j], arr[i]

            print (arr)

0
def bubble_sort(li):
    l = len(li)
    tmp = None
    sorted_l = sorted(li)
    while (li != sorted_l):
        for ele in range(0,l-1):
            if li[ele] > li[ele+1]:
                tmp = li[ele+1]
                li[ele+1] = li [ele]
                li[ele] = tmp
    return li

0
def bubbleSort ( arr ):
    swapped = True 
    length = len ( arr )
    j = 0

    while swapped:
        swapped = False
        j += 1 
        for i in range ( length  - j ):
            if arr [ i ] > arr [ i + 1 ]:
                # swap
                tmp = arr [ i ]
                arr [ i ] = arr [ i + 1]
                arr [ i + 1 ] = tmp 

                swapped = True

if __name__ == '__main__':
    # test list
    a = [ 67, 45, 39, -1, -5, -44 ];

    print ( a )
    bubbleSort ( a )
    print ( a )

0
def bubblesort(array):
    for i in range(len(array)-1):
        for j in range(len(array)-1-i):
            if array[j] > array[j+1]:
                array[j], array[j+1] = array[j+1], array[j]
    return(array)

print(bubblesort([3,1,6,2,5,4]))

1
Mặc dù mã này có thể trả lời câu hỏi, việc cung cấp ngữ cảnh bổ sung về cách thức và / hoặc lý do giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời.
Alexander

0

Tôi xem xét thêm giải pháp của mình bởi vì bao giờ giải pháp ở đây đang có

  1. thời gian lớn hơn
  2. độ phức tạp không gian lớn hơn
  3. hoặc thực hiện quá nhiều thao tác

vậy thì nên

Vì vậy, đây là giải pháp của tôi:


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

Nếu bất cứ ai quan tâm đến việc thực hiện ngắn hơn bằng cách sử dụng một danh sách hiểu:

def bubble_sort(lst: list) -> None:
    [swap_items(lst, i, i+1) for left in range(len(lst)-1, 0, -1) for i in range(left) if lst[i] > lst[i+1]]


def swap_items(lst: list, pos1: int, pos2: int) -> None:
    lst[pos1], lst[pos2] = lst[pos2], lst[pos1]

0

Đây là một biến thể khác nhau của sắp xếp bong bóng không có forvòng lặp. Về cơ bản bạn đang xem xét lastIndexcủa arrayvà từ từ decrementingcho đến khi nó chỉ số đầu tiên của mảng.

Ý algorithmchí sẽ tiếp tục di chuyển qua mảng như thế này cho đến khi toàn bộ đường chuyền được thực hiện mà không swapsxảy ra.

Bong bóng là loại cơ bản là Quadratic Time: O(n²)khi nói đến hiệu suất.

class BubbleSort: 
  def __init__(self, arr):
    self.arr = arr;

  def bubbleSort(self):
    count = 0;
    lastIndex = len(self.arr) - 1;
    
    while(count < lastIndex):
      if(self.arr[count] > self.arr[count + 1]):
        self.swap(count)  
      count = count + 1;

      if(count == lastIndex):
        count = 0;
        lastIndex = lastIndex - 1;   

  def swap(self, count):
    temp = self.arr[count];
    self.arr[count] = self.arr[count + 1];
    self.arr[count + 1] = temp;
    
arr = [9, 1, 5, 3, 8, 2]
p1 = BubbleSort(arr)

print(p1.bubbleSort())

-1

Câu trả lời được cung cấp bởi fury và Martin Côte đã khắc phục vấn đề của vòng lặp vô hạn, nhưng mã của tôi vẫn không hoạt động chính xác (đối với danh sách lớn hơn, nó sẽ không sắp xếp chính xác.). Cuối cùng tôi đã bỏ qua unsortedbiến và sử dụng một bộ đếm thay thế.

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)

Nếu bất cứ ai có thể cung cấp bất kỳ gợi ý nào về cách cải thiện mã của tôi trong các bình luận, nó sẽ được đánh giá cao.


Bạn có thể tăng tốc độ sắp xếp bong bóng bằng cách bỏ qua phần danh sách mà bạn biết đã được sắp xếp (vì các lần lặp trước). Xem en.wikipedia.org/wiki/Bubble_sort#Alternative_im THỰCations
Blorgbeard sẽ ra vào

3
một lần nữa, tất cả những gì bạn thực sự cần làm là sử dụng boolean (gọi nó là không bị ảnh hưởng). khai báo nó bên ngoài vòng lặp của bạn; vòng lặp cho đến khi không chạm tới = true. trong vòng lặp while của bạn, đặt không bị ảnh hưởng là đúng; trong phần thân của bạn, đặt không bị ảnh hưởng là sai. Làm điều này, bạn có thể bỏ trường hợp khác của bạn. theo cách này, nếu bạn từng chuyển đổi hai phần tử, vòng lặp của bạn sẽ tiếp tục; nếu bạn không, vòng lặp sẽ không.
Paul Sonier

-1

Thử cái này

a = int(input("Enter Limit"))


val = []

for z in range(0,a):
    b = int(input("Enter Number in List"))
    val.append(b)


for y in range(0,len(val)):
   for x in range(0,len(val)-1):
       if val[x]>val[x+1]:
           t = val[x]
           val[x] = val[x+1]
           val[x+1] = t

print(val)

-1

idk nếu điều này có thể giúp bạn sau 9 năm ... đó là một chương trình sắp xếp bong bóng đơn giản

    l=[1,6,3,7,5,9,8,2,4,10]

    for i in range(1,len(l)):
        for j in range (i+1,len(l)):
            if l[i]>l[j]:
                l[i],l[j]=l[j],l[i]

-1
def merge_bubble(arr):
    k = len(arr)
    while k>2:
        for i in range(0,k-1):
            for j in range(0,k-1):
                if arr[j] > arr[j+1]:
                    arr[j],arr[j+1] = arr[j+1],arr[j]

        return arr
        break
    else:
        if arr[0] > arr[1]:
            arr[0],arr[1] = arr[1],arr[0]
        return arr 

-1
def bubble_sort(l):
    for i in range(len(l) -1):
        for j in range(len(l)-i-1):
            if l[j] > l[j+1]:
                l[j],l[j+1] = l[j+1], l[j]
    return l

Sẽ là tốt hơn để thêm một số lời giải thích cho mã của bạn.
Masoud Rahimi

-1
def bubble_sorted(arr:list):
    while True:
        for i in range(0,len(arr)-1):
            count = 0
            if arr[i] > arr[i+1]:
                count += 1
                arr[i], arr[i+1] = arr[i+1], arr[i]
        if count == 0:
            break
    return arr
arr = [30,20,80,40,50,10,60,70,90]
print(bubble_sorted(arr))
#[20, 30, 40, 50, 10, 60, 70, 80, 90]

-3

def bubbleSort(a): def swap(x, y): temp = a[x] a[x] = a[y] a[y] = temp #outer loop for j in range(len(a)): #slicing to the center, inner loop, python style for i in range(j, len(a) - j):
#find the min index and swap if a[i] < a[j]: swap(j, i) #find the max index and swap if a[i] > a[len(a) - j - 1]: swap(len(a) - j - 1, i) return a

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.