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

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

新規登録して質問してみよう
ただいま回答率
85.48%
データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

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

Q&A

3回答

196閲覧

クイックソートのプログラミングについて Python

mau

総合スコア13

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

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

0グッド

0クリップ

投稿2019/08/17 06:53

平素よりお世話になっております。
クイックソートのプログラミングについて質問させて頂きます。
クイックソートは、リストの先頭の要素を基準に、小さいものと大きいもの振り分ける行為を振り分け要素数が1になるまで繰り返し整列させて結合させるものだと理解しています。
ただ、それに伴うプログラムが各所わからなかったので質問させていただきます。
本は、
書名:Pythonで体験してわかるアルゴリズムとデータ構造
著者:西澤弘毅、森田光
出版日:2018年6月30日初版
出版社:近代科学社
を使っています。

Python

1def sort(A): 2 if len(A)<2: 3 return A 4 p=A[0] 5 X,Y=divide(p,A[1:]) 6 return sort(X)+[p]+sort(Y) 7 8def divide(p,A): 9 if len(A)<1: 10 return ([],[]) 11 X,Y= divede(p,A[1:]) 12 a=A[0] 13 if a<p: 14 return ([a]+X,Y) 15 else: 16 return (X,[a]+Y)

1つめの質問
上記のソースの5行目
X,Y=divide(p,A[1:])
X,Yに対して関数でアンパックというのが意味わかりません。関数からX,Yそれぞれに代入できる複数の値が出力されるのでしょうか?

2つめの質問
5行目で変数の呼び出し→9~10行目では条件を満たさな場合、11行目
X,Y= divede(p,A[1:])
に移行すると思うのですが、無限ループするのでは?と思うのですが、ここの考え方がよくわかっていないので動き方について教えてください。

3つめの質問
a=A[0]
if a<p:
return ([a]+X,Y)
else:
return (X,[a]+Y)
が何をやっているのかわかりません。

...
とあげればきりがないほど全体の流れが理解できていません。回答のほどお願いします。

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

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

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

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

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

guest

回答3

0

1つめの質問
上記のソースの5行目
X,Y=divide(p,A[1:])
X,Yに対して関数でアンパックというのが意味わかりません。関数からX,Yそれぞれに代入できる複数の値が出力されるのでしょうか?

初心者はその捉え方でもいいですが、うるさいことを言うと返す値は1つで、pythonのアンパックという機能でそれぞれの変数に代入されるわけですね。

python

1 if a<p: 2 return ([a]+X,Y) 3 else: 4 return (X,[a]+Y)

返り値は([a]+X,Y)または(X,[a]+Y)というタプルなのですが、これの各要素がXYに代入されます。

python

1>>> tup = (1, 2) 2>>> a, b = tup 3>>> a 41 5>>> b 62

詳細はシーケンスアンパックとかで検索すれば色々出てくると思います。


2つめの質問

5行目で変数の呼び出し→9~10行目では条件を満たさな場合、11行目
X,Y= divede(p,A[1:])
に移行すると思うのですが、無限ループするのでは?と思うのですが、ここの考え方がよくわかっていないので動き方について教えてください。

sort関数の引数のAdivide関数の引数のAは別物なので、同じように見えるA[1:]という式でも結果が違います。具体的には、再帰呼び出しのたびに先頭の要素がなくなったリストが渡されています。


3つめの質問

a=A[0]
if a<p:
return ([a]+X,Y)
else:
return (X,[a]+Y)
が何をやっているのかわかりません。

上では最初の要素を除外したリストを2つに分割していますね。

最初の要素をどっち側にいれるかべきかをここで決めています。

投稿2019/08/17 08:46

hayataka2049

総合スコア30933

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

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

mau

2019/08/17 13:19 編集

2つ目の質問についてもう少し詳しく知りたいので質問させていただきます。関数の性質上sort(A)もdivide(p,A)もローカル変数なので違うものであることは承知してます。聞きたいのはこのことではなく、もう少し詳しい流れをお聞きしたいのです。具体的に話を進めるため、今回A=[4,8,2,9,6,3,5,1,7]と仮定させていただきます。このとき、sort(A)での処理でA[0]=4をpに代入し、A[0]以外の他のリストをdivide(p,A[1:])で処理を行うことをしていますよね!?そのあと、divide(p,A[1:])の処理を進めると、 if len(A)<1: return ([],[]) というところにいき、このときlen(A)は8なので条件を満たさないのでスルーする。このあと、 X,Y= divede(p,A[1:]) にたどりつき pの値と要素数が変化しないと思いました。そのため無限ループなのでは?と考えたのですが、ここでの処理は具体的にどのように動いているのでしょうか?
hayataka2049

2019/08/17 13:31

そこまでわかっておられるにも関わらず、「pの値と要素数が変化しないと思いました。」と判断された理由がよくわかりません。 ローカル変数のA(値は[8,2,9,6,3,5,1,7])に対してA[1:]は[2,9,6,3,5,1,7]になるので、ちゃんと短くなります。
guest

0

プログラムの実行環境はありますか?
分からなければ実際に動かして、print関数等でステップ毎に変数の中身などを確認しましょう。

投稿2019/08/17 07:13

pea

総合スコア419

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

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

0

質問1:

if a<p: return ([a]+X,Y) else: return (X,[a]+Y)

の部分がdivide()の返却ですので、
この二つの値をそれぞれX, Yに代入している形式です。

質問2:
devide()は再帰呼び出し(関数の中で同名の関数が呼び出される)になっていますが、再帰が深くなるごとに配列Aの要素数は1ずつ小さくなっているので、いつかは必ず
if len(A) < 1
に引っかかり、無限ループはしません。

質問3:配列Aの先頭要素A[0]と基準値pを比較し、A[0]がpより小さければ一つ目の配列(X)に、pより大きければ二つ目の配列(Y)に格納されるようなロジックになっています。

投稿2019/08/17 07:09

gnbrganchan

総合スコア438

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問