我會看看我能爲你做些什麼。的代碼,以供參考:
def my_sort(array):
length_of_array = range(1, len(array))
for i in length_of_array:
value = array[i]
last_value = array[i-1]
if value<last_value:
array[i]=last_value
array[i-1]=value
my_sort(array)
return array
def my_sort(array):
,其採用數組作爲參數的函數。
length_of_array = range(1, len(array))
我們設置變量length_of_array
來,我們可以遍歷號碼range
,基於項目的array
數量。我假設你知道range
的作用,但是如果你不知道,簡而言之,你可以用迭代列表的方式迭代它。
for i in length_of_array:
value = array[i]
last_value = array[-1]
我們正在做的是使用range
間接遍歷數組,因爲有相同的總在每一個項目的是(你也可以使用xrange()
這裏)。如果仔細觀察,value
使用i
作爲其索引,該索引從1開始,因此value
實際上是array [1],並且last_value
是array[1-1]
或array[0]
。
if value<last_value:
array[i]=last_value
array[i-1]=value
所以現在我們正在比較這些值。假設我們通過了。我們正處於循環的第一次迭代中,所以我們基本上說,如果array[1]
(它是1)小於array[0]
(它是3),則交換它們。當然1小於3,所以換掉它們就行了。但由於代碼只能將每個項目與前一項目進行比較,因此不能保證array
將從最低到最高排序。如果接下來的項目較大,每次迭代都可以不交換正確交換的項目(例如[2,5,6,4]在前兩次迭代中保持不變 - 它們將被if
測試忽略 - 但是當它擊中第三,6將交換與4,這仍然是錯誤的)。事實上,如果我們要在沒有直接在my_sort(array)
之下撥打電話的情況下完成此操作,我們的原始array
將評估爲[1, 3, 2, 3, 4, 6]
。不完全正確。
my_sort(array)
所以我們遞歸地調用my_sort()
。我們基本上說的是,如果在第一次迭代中出現問題,請糾正它,然後將新的array
返回到my_sort()
。這聽起來很奇怪,但起作用。如果if
測試從來沒有滿意,那麼這意味着我們原始列表中的每個項目都小於下一個,這是另一種方式(電腦的方式)說它是按升序排序開始的。 這是關鍵。因此,如果任何列表項目比前一個項目小,我們就會把它留下一個索引。但我們並不知道是否是是正確的 - 也許它需要更進一步。所以我們必須回到開始階段(也就是在我們新制作的名單上再次打電話my_sort()
),然後重新檢查是否應該再次拉它。如果我們不能,則if
測試失敗(每個項目比下一個小),直到它遇到下一個錯誤。在每次迭代時,這將向同一個較小的數字向左調整一個索引,直到它處於正確的位置。這聽起來更加混亂比它,所以我們就看看輸出每個迭代:
[3, 1, 3, 2, 6, 4]
[1, 3, 3, 2, 6, 4]
[1, 3, 2, 3, 6, 4]
[1, 2, 3, 3, 6, 4]
[1, 2, 3, 3, 4, 6]
你看到這是怎麼回事?怎麼樣,如果我們只看看有哪些改變在每次迭代:
[3, 1, ... # Wrong; swap. Further work ceases; recur (return to beginning with a fresh call to my_sort()).
[1, 3, 3, 2, ... # Wrong; swap. Further work ceases; recur
[1, 3, 2, ... # Wrong; swap. Further work ceases; recur
[1, 2, 3, 3, 6, 4 # Wrong; swap. Further work ceases; recur
[1, 2, 3, 3, 4, 6] # All numbers all smaller than following number; correct.
這樣,因爲它需要從後向前拉數函數調用自身多次。同樣,每次調用它時,它都將重點放在第一個錯誤的實例上,將它左移一次,直到將其放到適當的位置。希望有所幫助!讓我知道你是否仍然有麻煩。
似乎它只是一種不同形式的氣泡排序。 – vidit
參考文獻http://en.wikipedia.org/wiki/Bubble_sort – user2864740