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

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

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

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

Q&A

解決済

2回答

1318閲覧

バブルソートの問題でつまずいています...

MAMOMIMOMU

総合スコア13

Python

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

0グッド

0クリップ

投稿2020/01/08 16:18

編集2020/01/08 18:20

Pythonでバブルソートの問題を解いていますが、以下のように書いたところ、
全くソートされないで出力されてしまいます。どこに問題があるでしょうか...

python

1N = int(input()) 2number_list = list(map(int, input().split())) 3 4i = len(number_list) - 1 5j = len(number_list) - 1 6print(i) 7 8temp = 0 9 10while i < 1: 11 j = i 12 while j < 1: 13 if number_list[j] < number_list[j - 1]: 14 temp = number_list[j - 1] 15 number_list[j - 1] = number_list[j] 16 number_list[j] = temp 17 j -= 1 18 i -= 1 19 20print(number_list)

また、競プロではこの手のソートの問題が多いですが、Pythonで書くと
いつもこのようにループ処理の箇所がぎこちないというか、
初期化で困ります。
Cのfor文ならもっとスマートに書けるのになぁと思いながら書いています。
Pythonでこの手の問題を解く際にこう書いたほうが良いよといった方法は
ございますでしょうか?
(私の知識不足のせいでこんなぎこちなくなってしまっているのだろうなと...)

回答お願いいたします。

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

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

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

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

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

jimbe

2020/01/08 17:25

c のご質問でなければタグを外して頂けますか.
jimbe

2020/01/08 18:25

ありがとうございます.
guest

回答2

0

適当にループ内部にデバッグプリントを置くと、一度も実行されていないことがわかります。
ループに入っていないのならば、まず条件部に着目するのが自然でしょう。

Python

while i < 1:
j = i
while j < 1:
...

どちらのループも条件がおかしいです。

Python

1while 0 < i: 2 j = i 3 while 0 < j: 4 ...

競プロではこの手のソートの問題が多いですが、Pythonで書くと

いつもこのようにループ処理の箇所がぎこちないというか、
初期化で困ります。

一つ凄く不思議なのですが、競プロって解法を指定されることってありましたっけ?

ソートに限って言えばlist.sortメソッドやsorted関数を使えば良いです。
既にあるものは使うべきです。

Pythonでこの手の問題を解く際にこう書いたほうが良いよといった方法は

ございますでしょうか?

どの言語でも言えることですが、段階を踏んで機能を実装すべきです。
全体が完成してからテストをすると関心が分散し効率が悪くなります。

また、PythonにはPythonに向いたロジックがあります。
C言語の発想をそのまま持ち込んでもなかなかうまく行きませんので、
言語に慣れるようさまざまな構文や関数・モジュールを試してみると良いでしょう。

投稿2020/01/08 23:43

編集2020/01/09 00:06
LouiS0616

総合スコア35660

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

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

MAMOMIMOMU

2020/01/09 07:35

回答ありがとうございます。 >また、PythonにはPythonに向いたロジックがあります。 C言語の発想をそのまま持ち込んでもなかなかうまく行きませんので、 言語に慣れるようさまざまな構文や関数・モジュールを試してみると良いでしょう。 こちら座右の銘にしたいとおもいます。 今は競プロの問題を、テーマごとに勉強していて、挿入ソートとか、バブルソートとか、 順々に解いていましたが、解答がC言語でしか載っていないので、Cのロジックに引っ張られていたというのがあります。しかし、流石にこのPythonコードは酷すぎましたね... もっと精進します。printの挿入など、とても参考になりました。ありがとうございました。
guest

0

ベストアンサー

python

1N = int(input()) 2numbers = list(map(int, input().split())) 3 4for right in range(N - 1, 0, -1): 5 for left in range(right): 6 if numbers[left] > numbers[left + 1]: 7 numbers[left], numbers[left + 1] = numbers[left + 1], numbers[left] 8 9print(numbers)

C言語と比較(データ入力は省略)

C

1#include <stdio.h> 2 3int main() { 4 int N = 10; 5 int numbers[] = {2,3,9,4,1,5,8,7,0,6}; 6 7 for (int right = N - 1; right > 0; right--) { 8 for (int left = 0; left < right; left++) { 9 if (numbers[left] > numbers[left + 1]) { 10 int temp = numbers[left]; 11 numbers[left] = numbers[left + 1]; 12 numbers[left + 1] = temp; 13 } 14 } 15 } 16 17 for (int i = 0; i < N; i++) 18 printf("%d ", numbers[i]); 19 printf("\n"); 20}

投稿2020/01/08 22:03

編集2020/01/08 22:33
shiracamus

総合スコア5406

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

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

MAMOMIMOMU

2020/01/09 07:37

回答ありがとうございます。 rangeを使うという発想がなぜ出なかったのか... そして、Cの方がこういう問題解きやすいなぁと思いましたが、 Pythonでも全く不自由なく書けますね... 非常に参考に、というか模範解答を提示していただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問