我是編程初學者,我的問題是:為什么我需要 2 個“for 回圈”才能作業?感謝您提前提供任何答案^^
# Bubble sort
a = [2092, 8966, 564331, 989]
laenge = len(a)
for i in range(1,laenge):
for j in range(0,laenge-i):
if a[j] > a[j 1]:
tempdata = a[j]
a[j] = a[j 1]
a[j 1] = tempdata
print (a)
print (" Surprise monkey")
uj5u.com熱心網友回復:
可以在單個回圈中完成,但您仍然需要兩個控制變數來管理資料的多次傳遞。考慮到最后一個位置將按排序順序獲得其適當的元素,可以通過將范圍縮短 1 來優化每次傳遞。只要一次通過沒有交換,整個回圈就可以停止。
基本形式:
a = [2092, 8966, 564331, 989]
i,j = 1,len(a)-1
while j:
if i>j: i,j = 1,j-1 # new pass
if a[i-1]>a[i]:
a[i-1],a[i] = a[i],a[i-1] # preform swap
i = 1 # next swap index
print(a)
[989, 2092, 8966, 564331]
使用交換檢測優化:
a = [2092, 8966, 564331, 989]
last = len(a) # sorted positions from last to 1st
i = last 1 # current swapping index
swapped = True # swap detection
while last:
if i>last: # pass complete, reset indexes
if not swapped: break # done if no swaps made
last -= 1 # last is sorted
i,swapped = 1,False # start new pass
if a[i-1]>a[i]:
a[i-1],a[i] = a[i],a[i-1] # preform swap
swapped = True
i = 1 # next swap index
print(a)
[989, 2092, 8966, 564331]
uj5u.com熱心網友回復:
冒泡排序的作業方式是,每次遍歷串列后,它都保證將下一個最大的元素推送到串列的末尾(https://www.youtube.com/watch?v=JP5KkzdUEYI)。
因此,一旦我們使用回圈(內回圈)來傳遞串列,如果它們無序,則交換每對元素。在對最后一個元素進行排序后執行此操作,對最后兩個元素進行兩次排序,依此類推。因此,要完全對串列進行排序,我們需要對資料進行 n 次回圈,其中 n 是元素的數量(外回圈)。
這個嵌套回圈是冒泡排序是 O(n^2) 并且不是首選排序演算法的原因
a = [2092, 8966, 564331, 989]
laenge = len(a)
for i in range(1,laenge): # run inner loop n times to sort all elements
for j in range(0,laenge-i): # completing this loop will sort the last unsorted element
if a[j] > a[j 1]:
tempdata = a[j]
a[j] = a[j 1]
a[j 1] = tempdata
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/367979.html
