Để 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])là (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.)