もしくは細かいことは気にせず、"このように書けば並び替えができる"と覚えてしまうほうが良いのでしょうか?
その考え、相当危険な考えです。「小説を書きたいです。羅生門で『ある日の暮方の事である。一人の下人げにんが、羅生門らしょうもんの下で雨やみを待っていた。』と始まっていますが、「こう書けばいい」と暗記すべきでしょうか?」みたいなものです。( 引用: 青空文庫 ) いや、違うだろ…と言いたくなりますよね。
プログラミングは「こう書けばいい」というものではありません。ロジック(論理)を書くのです。
簡単に言えば「現実世界のシミュレーション」です。
なので、とりあえず、コードを読みましょう。
コードを読むコツは『一行レベルで、その行が何をしているかを考えながら読む』です。
たとえば、(ソースコードのファイルをコピーするなりしてバックアップを取って)「コメント文にする」とかです。
Python
1# 「数1>」と入力を促し、ユーザ入力を受け付け、number_1に入れる
2number_1 = int(input("数1>"))
3# 「数2>」と入力を促し、ユーザ入力を受け付け、number_2に入れる
4number_2 = int(input("数2>"))
5# 「数3>」と入力を促し、ユーザ入力を受け付け、number_3に入れる
6number_3 = int(input("数3>"))
7
8# number_1 が number_2 より大きいなら
9if number_1 > number_2:
10 # 変数 temp に number_1の値を入れる
11 temp = number_1
12 # number_1にnumber_2の値を入れる
13 number_1 = number_2
14 # number_2 に tempの値を入れる
15 number_2 = temp
16# number_1 が number_3 より大きいなら
17if number_1 > number_3:
18 # 変数tempに number_1の値を入れる
19 temp = number_1
20 # ...(中略)...
21
22# 結果を表示する
23print(number_1,number_2,number_3,sep='')
ですね。これを疑似コードとして書き出す。
1. 「数1>」とと入力を促し、ユーザ入力を受け付け、number_1に入れる
2. 「数2>」とと入力を促し、ユーザ入力を受け付け、number_2に入れる
3. 「数3>」とと入力を促し、ユーザ入力を受け付け、number_3に入れる
4. number_1がnumber_2より大きいなら
4.1. tempにnumber_1の値を入れる
4.2. number_1にnumber_2の値を入れる
...
5. number_1がnumber_3より大きいなら
5.1. tempにnumber_1の値を入れる
5.2. number_1にnumber_2の値を入れる
...
6. ...
7. 結果を出力する
さらにこれを現実世界でシミュレーションしてみる。たとえばマジックの手順なり、料理のレシピとしてなり、数学の計算式としてでなり、実際に手を動かしてやってみる。
実際のデータ(今回だと整数とか)を入れて計算してみる。
(1)~(3)は現実世界だと、『相手に質問して、そのアンサーを受け取る』的な感じですね。
(4)では、まず一つ目と二つ目を比較して、大きい方を後ろに持ってくる。
つまり、『交換』しなければいけない。でも多くのプログラミング言語では、すぐにnumber_1 = number_2 と交換する事はできません。これをやってしまうと、number_1の方に上書きされてしまい、aに入っていたデータが消えてしまいます。なのでどこかに退避しなければいけませんね。なので一旦別のところ、つまり上記だと 変数tempに当たるやつに入れておきます。すると、number_1にはまだデータは入っていますが、tempの方にも同じやつがあるので持っていても意味ない。なのでnumber_1にはnumber_2の値を入れる。そうするとnumber_2の値はnumber_1の方にも入っているので、このデータは上書きしても問題ありませんね。なのでtempの値を入れる。
そうするとあら不思議。最終的に number_1 とnumber_2 の値が入れ替わっている状態になりますね。
つまり、(4.1)~(4.3)は交換しているだけです。『交換アルゴリズム』と呼ばれるものらしいです。
で、number_1とnumber_3も同じように比較して大きい方を後ろに持ってくる。
これによって、一番小さい値が前(つまりnumber_1)に入っています。
よってnumber_1はほぼ確定。
でもまだnumber_2とnumber_3が本当に昇順になっているのかは不確定です。
なのでnumber_2とnumber_3も同じように大きい方を後ろに持ってくる。
そうすると、昇順になるのです。それを出力しているだけですね。
本当か? と思うのなら実際にデータを当てはめて考えるとわかりやすいです。
an = { 3, 10, 2 } というものが与えられているとします。number_1 = 3, number_2 = 10...とします。
number_1 = 3, number_2 = 10 なので 3 > 10 は満たしません。なのでスルー。
number_1 = 3, number_3 = 2 なので 3 > 2 は満たしますね。よって、交換アルゴリズムにより、number_1 = 2, number_3 = 3となる。
でも、並びを見ると、{ 2, 10, 3 } と 2,3は良いのですが、間にある10は明らかにデカすぎる。本来は一番後ろに来ていないといけない。並び的に{ 2,~, 3, ~ } のように2,3の並びはすでに確定。単に10の位置が違うだけ。よってnumber_2とnumber_3を比較する。
number_2 = 10, number_3 = 3 ですね。10 > 3は満たしますから、交換アルゴリズムにより、
number_2 = 3, number_3 = 10 となります。
並べると、あら不思議。 bn = { 2, 3, 10 } という風になっているはです。
これを実装しているだけです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。