2017-02-03 14 views
0

私はPythonで選択ソートを実装しましたが、inner forループのこの小さな部分を理解できませんでした。選択ソートの一部を実装する際に問題が発生しました

jためforループ、私は外側のインデックスiから最大長-1の範囲を持っているが、これは私に多くの意味になりますが、結果は配列の最後の数をカウントしていないだろう、と私ができますその理由を考えないでください。

ただし、範囲をiから最大長に変更すると機能します。 (私の知識ではalist[len(alist)]が1桁をカウントするので、配列を超えていなければなりません)。

#Go over the loop, find the smallest num 
def swap(arr, num_1, num_2): 
    temp = arr[num_1] 
    arr[num_1] = arr[num_2] 
    arr[num_2] = temp 

def selectionSort(alist): 
    for i in range(0, len(alist)-1): 
     min = i 
     # for j in range(i+1, len(alist)): 
     # Why len(alist)-1 doesn't work? 
     for j in range(i, len(alist)-1): 
      if alist[j] < alist[min]: 
       min = j 
     if min != i : 
      swap(alist,i,min) 
    return alist 


# Test 
print "-------------Test--- ----------" 
A = [2,1,9,3,4,100,99,30] 
print selectionSort(A) 

答えて

2

Pythonの範囲についてもう一度読んでください。 という明確な概念がありません。 range(0, 3)は、例えば、[0, 1, 2]とほぼ同等です。 2番目の値のすぐ下で停止します。同じことがスライスにも当てはまります。

+0

私はそれを読み、それは今意味があります!しかし、これが当てはまる場合、テストケースでこの配列Aをたどって外側ループ内のすべてを介在させたいとしたら、 "for i in range(0、len(alist))"を持つことはできますか? len(alist)は8で、Aにループするだけです。[7] –

+0

あなたのプログラムが設定されているので、うまくいくでしょう。しかし、もし私が選択ソートを書いていたら、次の最後の項目で外側のループを止め、 'i + 1'で' j'を起動します。また、ゼロから開始することがデフォルトであるので、 'for i in range(len(alist))'と言うことができます。 –

+0

あなたの考えを精緻化してもらえますか?私は選択ソートで誰かの実装を見ていた、それはあなたがそれを記述した方法とまったく同じです。たとえば、外側のループの最後の項目を停止すると、配列の最後の項目を無視しないでしょうか?また、i + 1でjを開始すると、jをどこから除外したいのでしょうか? 'そのアイテムはそれ自身と比較されますか? –

関連する問題