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

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

新規登録して質問してみよう
ただいま回答率
85.35%
JupyterLab

JupyterLabは、Jupyter notebookの後継の対話型開発環境(IDE)です。データの可視化がインタラクティブで、プラグイン作成により新しいコンポーネントの追加および既存のコンポーネントも統合可能。サーバに閉じているため、データ分析に向いています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

890閲覧

昇順・降順の仕組みについて

yu-ki.hiroshima

総合スコア17

JupyterLab

JupyterLabは、Jupyter notebookの後継の対話型開発環境(IDE)です。データの可視化がインタラクティブで、プラグイン作成により新しいコンポーネントの追加および既存のコンポーネントも統合可能。サーバに閉じているため、データ分析に向いています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/11/29 07:41

前提・実現したいこと

プログラミング初学者です。

入力された3つの値を、並び替えて出力するという内容を学習中なのですが、以下の記述でなぜ並び替えができているのかが理解できず困っています。

理解に詰まっている点としてはif文の動きで、『=』が多いので混乱しています。
なにか、よい解釈方法はありますでしょうか?

もしくは細かいことは気にせず、"このように書けば並び替えができる"と覚えてしまうほうが良いのでしょうか?

初歩的なことかもしれませんが、ご助言いただけますと幸いです。

該当のソースコード

python

1number_1 = int(input("数1>")) 2number_2 = int(input("数2>")) 3number_3 = int(input("数3>")) 4 5if number_1 > number_2: 6 temp = number_1 7 number_1 = number_2 8 number_2 = temp 9if number_1 > number_3: 10 temp = number_1 11 number_1 = number_3 12 number_3 = temp 13if number_2 > number_3: 14 temp = number_2 15 number_2 = number_3 16 number_3 = temp 17 18print(number_1,number_2,number_3,sep='')

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

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

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

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

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

guest

回答2

0

もしくは細かいことは気にせず、"このように書けば並び替えができる"と覚えてしまうほうが良いのでしょうか?

その考え、相当危険な考えです。「小説を書きたいです。羅生門で『ある日の暮方の事である。一人の下人げにんが、羅生門らしょうもんの下で雨やみを待っていた。』と始まっていますが、「こう書けばいい」と暗記すべきでしょうか?」みたいなものです。( 引用: 青空文庫 ) いや、違うだろ…と言いたくなりますよね。

プログラミングは「こう書けばいい」というものではありません。ロジック(論理)を書くのです。
簡単に言えば「現実世界のシミュレーション」です。

なので、とりあえず、コードを読みましょう
コードを読むコツは『一行レベルで、その行が何をしているかを考えながら読む』です。
たとえば、(ソースコードのファイルをコピーするなりしてバックアップを取って)「コメント文にする」とかです。

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 } という風になっているはです。

これを実装しているだけです。

投稿2021/11/29 08:45

BeatStar

総合スコア4962

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

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

0

ベストアンサー

3つの数 A, B, C を並び替えるので、まず一番前に来る(一番小さい)数を決定します。
それが最初の if と2個目の if です。例えば 7 5 3 という並びだとして、
7 5 3 から最初の if は7と5を比較し、小さい方が前に来るように入れ替える。
→ 5 7 3 今度は1番目の5と3番目の3を比較し、小さい方を前に来るように入れ替えるので、
→ 3 7 5
これで1番目は決定しましたから、あとは2番目と三番目のうち、小さい方が前に来るように入れ替えます。
→ 3 5 7

ソートとしては比較的単純な方式で、一般的には選択ソートと呼ばれる方法です。

ソートはいろいろなアルゴリズムが今も研究されているものであり、奥が深いです。
一度 https://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%BC%E3%83%88 あたりから見ていくといいかもしれません。

※分からない時は、トランプなど実物を使って実際に手を動かしてみると理解しやすいですよ

投稿2021/11/29 07:51

tacsheaven

総合スコア13703

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

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

yu-ki.hiroshima

2021/11/29 08:19

tacsheavenさん、ありがとうございます! ステップごとに解説いただいたおかげで理解することができました。 トランプを使って理解する方法や、ウィキペディアのリンクでさらに学習します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問