Để 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 unsorted
thà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 sorted
ra False
.
Ngay khi chúng tôi bắt đầu while
vò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 sorted
lại False
. sorted
sẽ 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 for
vòng lặp, bạn sử dụng biến element
. Về mặt kỹ thuật, element
khô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ư i
cho "index".
for i in range(0, length):
Các range
lệ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.)