コードは正確に書きましょう。まともに動くように手直しし、コメントを入れました。
python
1a = [5,9,4,1,8]
2length = len(a)
3
4i = 0
5while i<length:
6
7 minimum_index = i # i番を最小と仮定
8
9 j=i+1
10 while j<length:
11 if a[j]<a[minimum_index]: # 小さい方のインデックスがminimum_indexに入るようにする
12 minimum_index = j
13 j+=1 # 更新
14
15 if minimum_index != i: # 最小がi番になければ
16 a[i],a[minimum_index] = a[minimum_index],a[i] # スワップ。pythonではこう書けます。
17
18 print(str(i)+':'+str(a))
19 i+=1 # 更新
20
21print('sorted:'+str(a))
質問1への回答
カウント変数を更新しているだけであり、if
文の内容とは関係がありません。
C言語で書いた場合の、以下のfor
文と同じと考えるとわかりやすいと思います。(cを知らなかった場合はごめんなさい…)
c
1for(int j=0;j < length;j++){
2 // 処理
3}
j++
と同じく、更新部分です。(pythonではj++
とは書けませんが…)
質問2への回答
このロジックは選択ソートと言います。
以下のような動きをします。(()
はソート済み、[]
はi
の位置(スワップ対象)を指します。)
[5] 9 4 1 8
の中から一番小さいものを探す。j = 3
の時の1
が最小。
1
を[5]
とスワップしてソート済みにする。
(1) 9 4 5 8
(1) [9] 4 5 8
のうち、(1)
を除いたものの中から一番小さいものを探す。j = 2
の時の4
が最小。
4
を[9]
とスワップしてソート済みにする。
(1 4) 9 5 8
(1 4) [9] 5 8
のうち、(1 4)
を除いたものの中から一番小さいものを探す。j = 3
の時の5
が最小。
5
を[9]
とスワップしてソート済みにする。
(1 4 5) 9 8
(1 4 5) [9] 8
のうち、(1 4 5)
を除いたものの中から一番小さいものを探す。j = 4
の時の8
が最小。
8
を[9]
とスワップしてソート済みにする。
(1 4 5 8) 9
(1 4 5 8) [9]
のうち、(1 4 5 8)
を除いたものの中から一番小さいものを探す。9
が最小。
しかし、この時j
によるループは起こらず、結果的にスワップはなし。
minimum_index != i
がFalse
なのでスワップせず、と考えても差し支えない。
とにかく9
をソート済みにする。
(1 4 5 8 9)
このソートにおいて、
i
は()
より右側の要素のうち一番小さいインデックス(ここがスワップ対象になる)を指し、
j
はi
より大きい範囲で動かされ、最小の要素のインデックスを探索するのに使われています。
蛇足
for
文を使った方が可読性が高くなる気がしたので書いてみました。
python
1arr = [5,9,4,1,8]
2length = len(arr)
3
4for i in range(length-1):
5 print(i-1,':',*arr)
6 min_ind = i
7
8 for j in range(i+1,length):
9 if arr[min_ind] > arr[j]:
10 min_ind = j
11
12 arr[min_ind],arr[i] = arr[i],arr[min_ind]
13
14print('sorted',':',*arr)
実行結果
plain
1-1 : 5 9 4 1 8
20 : 1 9 4 5 8
31 : 1 4 9 5 8
42 : 1 4 5 9 8
5sorted : 1 4 5 8 9
(インデックス-1
は初期状態という意味とする。)
内包表記とか考えてみましたけど、下手にいじるよりか個人的にはこれがベストな気がします。