質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

628閲覧

python ソート、whileについて

popipi_1

総合スコア16

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/02/08 12:32

編集2018/02/08 13:18
このコードがどんな処理をしているのか具体的に知りたくて考えていたのですが 解読できないので教えてください。 質問1: if a[j]<a[minimun_index]: minimum_index=j j+=1 ↑この部分では、もし、a[j]<a[minimun_index]:に当てはまった場合に、j+=1をするのですか? それとも当てはまっていない場合にj+=1をするのですか? 質問2: 参考書によると…この処理を行った結果、一番最初にスワップされるのは、 要素の中の数字の 5と1らしいです。 しかし、リストを左から順に参照していって、if a[j]<a[minimun_index]: の場合に、次の処理をするならば、 5と1を比較する前に、5と4の大きさを比較してそこで先にスワップが 起こらないのですか?なぜですか? 宜しくお願い致します。 a=[5,9,4,1,8] length=len(a) i=0 while(i<length): minimun_index=i j=i+1 while j<length: if a[j]<a[minimun_index]: minimum_index=j j+=1 if minumum_index !=i: tmp=a[i] a[i]=a[minimum_index] a[minimum_index]=tmp print(str(i)+':'+str(a)) i+=1 print('sorted:'+str(a))

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SatoshiMashino

2018/02/08 12:37

入力の規則に則って、インデントがちゃんと表示されるようにしてください。
popipi_1

2018/02/08 13:00

すみません、編集しました。
guest

回答2

0

ベストアンサー

コードは正確に書きましょう。まともに動くように手直しし、コメントを入れました。

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の位置(スワップ対象)を指します。)

  • i = 0

[5] 9 4 1 8

の中から一番小さいものを探す。j = 3の時の1が最小。

1[5]とスワップしてソート済みにする。

(1) 9 4 5 8

  • i = 1

(1) [9] 4 5 8

のうち、(1)を除いたものの中から一番小さいものを探す。j = 2の時の4が最小。

4[9]とスワップしてソート済みにする。

(1 4) 9 5 8

  • i = 2

(1 4) [9] 5 8

のうち、(1 4)を除いたものの中から一番小さいものを探す。j = 3の時の5が最小。

5[9]とスワップしてソート済みにする。

(1 4 5) 9 8

  • i = 3

(1 4 5) [9] 8

のうち、(1 4 5)を除いたものの中から一番小さいものを探す。j = 4の時の8が最小。

8[9]とスワップしてソート済みにする。

(1 4 5 8) 9

  • i = 4

(1 4 5 8) [9]

のうち、(1 4 5 8)を除いたものの中から一番小さいものを探す。9が最小。

しかし、この時jによるループは起こらず、結果的にスワップはなし。
minimum_index != iFalseなのでスワップせず、と考えても差し支えない。

とにかく9をソート済みにする。

(1 4 5 8 9)

このソートにおいて、

i()より右側の要素のうち一番小さいインデックス(ここがスワップ対象になる)を指し、

jiより大きい範囲で動かされ、最小の要素のインデックスを探索するのに使われています。

蛇足

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は初期状態という意味とする。)

内包表記とか考えてみましたけど、下手にいじるよりか個人的にはこれがベストな気がします。

投稿2018/02/08 13:50

編集2018/02/10 09:20
namnium1125

総合スコア2043

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

popipi_1

2018/02/14 16:57

基礎から丁寧な解説で、とても助かりました!!スッキリ理解できました!ありがとうございます。
guest

0

質問1

j+=1はifブロックの外にあるので、ifに当てはまっていても全ての場合で実行されます。

質問2

if minumum_index !=i:以下のブロックは、while j<length:以下のブロックの外にあります。つまり、while条件が崩れない限り、スワップは起こりません。
whileのブロックで行っているのは、リストのi番目以上の要素の中で最小のものを特定することです。最小の要素である1が発見され、そこにminimum_indexがつけられてから、初めてスワップが起こります。

投稿2018/02/08 13:31

Udomomo

総合スコア1524

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

popipi_1

2018/02/14 15:59

分かりやすい解説ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問