เพื่ออธิบายว่าทำไมสคริปต์ของคุณทำงานไม่ถูกต้องตอนนี้ฉันจะเปลี่ยนชื่อตัวแปรที่จะ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
element
ในทางเทคนิคelement
ไม่ใช่องค์ประกอบ เป็นตัวเลขที่แสดงดัชนีรายการ นอกจากนี้มันค่อนข้างยาว ในกรณีเหล่านี้ให้ใช้ชื่อตัวแปรชั่วคราวเช่นi
สำหรับ "ดัชนี"
for i in range(0, length):
range
คำสั่งนอกจากนี้ยังสามารถใช้เวลาเพียงหนึ่งอาร์กิวเมนต์ (ชื่อstop
) ในกรณีนี้คุณจะได้รับรายการจำนวนเต็มทั้งหมดจาก 0 ถึงอาร์กิวเมนต์นั้น
for i in range(length):
คู่มือสไตล์หลามแนะนำว่าตัวแปรที่มีชื่ออยู่ในตัวพิมพ์เล็กด้วยขีด นี่เป็น nitpick เล็กน้อยสำหรับสคริปต์เล็ก ๆ เช่นนี้ มันเป็นมากกว่าที่จะทำให้คุณคุ้นเคยกับสิ่งที่โค้ด Python ส่วนใหญ่มักจะมีลักษณะ
def bubble(bad_list):
หากต้องการสลับค่าของตัวแปรสองตัวให้เขียนเป็นการกำหนดค่าทูเพิล ทางขวามือจะได้รับการประเมินเป็นทูเปิล (พูด(badList[i+1], badList[i])
คือ(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
(ฉันลบคำสั่งพิมพ์ของคุณด้วย)