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

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

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

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

Q&A

解決済

2回答

840閲覧

python バブルソート

locka

総合スコア1

Python

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

0グッド

0クリップ

投稿2021/06/24 05:19

編集2021/06/24 14:57

pythonでのバブルソートについて質問させていただきます。
下のコードを
6
5 4 3 1 2 6を入力として実行すると、
[5, 4, 3, 1, 2, 6]が返ってきます。
全くソートされていませんでした。

自分でいくら考えても同じ結果が返ってきます。
どの部分がおかしいでしょうか。
教えてください。

python

1 2def bubbleSort(R,a): 3 aa = a-1 4 for i in range(a): 5 j = aa 6 while not(j == i): 7 if (R[j]<R[j-1]): 8 R[j-1] ,R[j]= R[j],R[j-1] 9 j -=1 10 else : 11 break 12 13a = int(input()) 14R =list(map(int,input().split())) 15bubbleSort(R,a) 16print(R) 17コード

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

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

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

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

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

guest

回答2

0

ベストアンサー

jの値がどのように変化するか考えてみましょう。
jiまで1ずつ減っていくよう意図された変数だと思いますが、質問者さんのコードだとif (R[j]<R[j-1]):の条件に一致した場合のみjが減るコードになっています。

python

1def bubbleSort(R,a): 2 aa = a-1 3 for i in range(a): 4 j = aa 5 while not(j-1 < i): 6 if (R[j]<R[j-1]): 7 R[j-1] ,R[j]= R[j],R[j-1] 8 j -= 1

投稿2021/06/24 05:50

ku__ra__ge

総合スコア4524

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

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

ku__ra__ge

2021/06/24 06:04

考えてみましょうとは言いましたが、まず`print(j)`の行をループ内に追加して j の値がどのように変化しているか表示させてみるのが手っ取り早いです。 プログラムが意図しない動作をしているときは変数の変化が意図しないものになっているはずなので、自分の意図と実際の変数の内容にどのような差があるのかを確認して、その差が発生する原因をコードから探すと問題の解決方法を知ることができます。
locka

2021/06/24 09:24

ありがとうございました。 おかげでできました。 一応print(j)をして確かめたのですが、なぜそうなるのかを見つけることができませんでした。 そもそものアルゴリズムの理解が間違っていました。 ありがとうございました。
guest

0

ku__ra__geさんに賛成です。

まず、プログラミングは「書いて終わり」……ではありません。

デバッグやテスト(検証)まで含みます

デバッガでデータの値や流れを確認したり、テスト(検証)というエラー系等のものも試したりとかです。

趣味でやっている場合はテストまでは手が届かないこともありますが、基本的にはやるべきです。

ましてやデバッグしないとそもそも動きません。

(デバッグをせずとも、たまたまうまくいくときもあるが、相当まれ)

また、プログラミングは「こう書けばいい」っていうものじゃないです。

「俺はDIYが趣味だ」と言う人が、「俺、椅子を作ってみたんだけど、なんか高さが合わないから誰か修繕してくれねーか?」と言ったとします。

本当にDIYが趣味なのか疑わしくありませんか?

プログラミングをするけど、デバッグを自分でやらないのはこういうのと一緒です。

まずはご自分でデバッグしましょう。それからです。

(もちろん、実務ではチーム開発が基本らしいので、デバッグ担当とかみたいに役割分担をしますが、
軽いデバッグすらできない人はそもそもプログラミングが出来ないです)


[追記1]

例えば今回のような問題は質問せず、自分で見つけるべきということでしょうか。BeatStarさんはどのような質問が望ましい思いますか。

私は説明下手なので綺麗な質問・回答はできませんが、それでも心掛けていることがあります。

情報を提示する事』です。

たとえば、『自分がやったこと』『参考にしたサイトのURL』『自分なりの解釈』、
『どのような流れでやったか』(たとえばどのように起動したとか)
……というように、『第三者が再現できるような説明』です。

今回の場合は、

やったこと・試したこと: 1. まずは (記述する場所のコード)に print(j) と置いて出力してみた => 結果は 1, 1, 1, 1, 1, 1... と常に1 になる 2. 計算式を (式1) から (式2) に変えてみた => 結果は (結果) となる 3. 起動時のコマンドライン引数を --a から --b に変えてみた => (結果) ...

と言う風に試したことを書く。

こうすると、回答者は『試したこと1だと こうなる……ってことは○○はあり得ないな』とかみたいに
何となく判断が出来ますし、丸投げにも見えません。

シンプルにしようとして、情報を削る人がいますが、あれはダメです。

むしろ情報が無さ過ぎて判断材料がないため、ゼロの状態から調べることになります。

情報が多すぎると確かに読みづらく、用件がはっきりしない場合がありますが、
それでも情報を隠されるよりはマシです。

『自分なりの解釈』だと、たとえば単なる思いつきの場合もありますが、
大抵はその人なりの論理によって引き出されます。

でもそのロジックに穴があったり、矛盾を抱えていることもしばしば。

その『なぜその考えに至ったのか』とかの経緯を書くと、
「んー、あー、惜しいわぁ……この方、こういう風に勘違いしているみたい」と
回答者は何となく判断でき、そのロジックも修正してくれます。

なので情報は出し渋らないこと

また、別に質問自体を問題視しているわけではないです。

私も何度も質問していますし、ホント、しょーもないことが原因(たとえばタイプミス、いわゆるタイポ)とかだったりします。
(後は参考サイトの最後らへんにヒントや答えがあるのに、そこまで目を通していなかったりとか)

なので別に悪いとは言いません。

でも、『参考にしたサイト』とか『試したこと』とかを書くだけでもだいぶ印象が変わります。

最初の質問だと、『コードは俺が書いたから、後は誰かがやってくれ』的な、
丸投げのような質問に見えます。
でも『どのように試した』とかを書くだけでも、『本当に自分なりにやっていて、手が足りないのだな』と
わかります。

そういう風に、質問方法をほんの少し工夫するだけでもだいぶ印象が変わります。

別に**『質問するな』ではないです**。

まあ、頑張ってください。(^▽^)

投稿2021/06/24 08:14

編集2021/06/24 10:42
BeatStar

総合スコア4962

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

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

locka

2021/06/24 09:40

回答ありがとうございます。 その通りですね。 しかし、どうゆう質問をしていいかが難しいですね。 今回も、print(j)などして、4時間ほど考えた結果、 pythonの文法自体に知らない間違えがあると思い 質問させていただきました。 実際はアルゴリズムの理解が間違ってました。 おそらく、コード書いたなら、そのくらいのコードのミスはデバックで気づくだろうということだと思います。 デバックした様子を質問に添付したりするなどが必要だったと思います。 例えば今回のような問題は質問せず、自分で見つけるべきということでしょうか。BeatStarさんはどのような質問が望ましい思いますか。 違う質問してしまってすみません。
BeatStar

2021/06/24 10:02

本文に追記しますね。
locka

2021/06/24 10:36

回答ありがとうございます。 質問の仕方の工夫などですね。 これから参考にさせていただきます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問