2013-11-15 54 views
2
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 

我知道函數的一般功能。它的排序alogarithm ....但我不知道每個單獨的部分/部分如何做。分揀功能。解釋

+4

似乎它只是一種不同形式的氣泡排序。 – vidit

+0

參考文獻http://en.wikipedia.org/wiki/Bubble_sort – user2864740

回答

3

嗯,我不得不說要理解這個最好的方法是試驗它,學習它使用什麼,基本上學習Python。 :)

不過,我會去通過線一個接一個的幫助:

  1. 定義一個名爲functionmy_sort接受名爲array一個參數。其餘的行都包含在這個函數中。

  2. 使用range創建一個範圍的數字,該數字範圍從1(含)至array(非包含)。然後,將此範圍分配給變量length_of_array

  3. 開始一個for-loop,它遍歷前一行定義的範圍。此外,將每個編號返回給變量i。此for循環包圍線4到9

  4. 創建一個變量value等於在i位置由indexingarray返回的項目。

  5. 創建一個變量last_value,該變量等於在位置i-1處索引array返回的項目。

  6. 測試value是否小於last_value。如果是這樣,請運行第7行到第9行。

  7. 使i索引array等於last_value

  8. 使i-1索引array等於value

  9. 重新運行my_sortrecursively,傳遞參數array

  10. 返回array用於遞歸函數的迭代。

array最終排序,遞歸將結束,你將留下array所有漂亮和排序。

我希望能夠對這個問題有所瞭解!

+0

我看到很多子彈,但代碼更清晰: – user2864740

0

我會看看我能爲你做些什麼。的代碼,以供參考:

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_valuearray[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. 

這樣,因爲它需要從後向前拉數函數調用自身多次。同樣,每次調用它時,它都將重點放在第一個錯誤的實例上,將它左移一次,直到將其放到適當的位置。希望有所幫助!讓我知道你是否仍然有麻煩。