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

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

新規登録して質問してみよう
ただいま回答率
85.48%
プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

1回答

696閲覧

アルゴリズム:クイックソートについて

Jorrvaskr_prg

総合スコア6

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2022/03/20 08:58

編集2022/03/20 15:08

画像ですみません

テキストを購入しクイックソートを学んでいるのですが、下記画像の疑似コードでわからないところがあります。

イメージ説明

副プログラムArrangeについて

仕組みや全体像はわかるのですが、Arrangeの中身について、L≦Rの次の行ですぐにLRを入れ替えています。

A[3,5,8,4,0,6,9,1,2,7]
が与えられていたとして、一巡目では
Arrange(A[],0,9,5,Ret)
が読み込まれると思うのですが、このままではA[0]=3とA[9]=7を入れ替えねばなりません。

しかし設問では
1回目 A[3,5,8,4,0,6,9,1,2,7] Min=0 Max=9
2回目 A[3,2,1,4,0,6,9,8,5,7] Min=0 Max=4
3回目 空欄問題
となっています。

3と7はどの段階で入れ替えを免れたのでしょうか。
教えていただけると助かります。 

※閲覧に対し回答が得られないため知恵袋にも投稿しております
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11259032066?post=1

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問への追記を求めるのも面倒なので、エスパーして教科書の実装を完成させた上で回答します。

3と7はどの段階で入れ替えを免れたのでしょうか。

1回目に通る Arrange では想像されている通り、一度 A[0]A[9] を交換しています。しかし、A[0]Pivot よりも小さくなければ A[0] を再び A[R] と交換しようとしています。同様に A[9]Pivot よりも大きくなければ A[9]A[L] と再び交換しようとしています。

つまり、Arrangewhile ループの1回目では、37 を交換しますが、その直後、2回目のループで 37 を元に戻しています。

その結果、まるで 37 の交換がなかったように QuickSort の1回目が終了しています。説明はこれでよいでしょうか。

c

1#include <stdio.h> 2#include <stdlib.h> 3 4#define true 1 5#define false 0 6 7void debug(int A[], int Min, int Max) { 8 int i; 9 for (i = 0; i < 10; ++i) { 10 if (i > 0) printf(", "); 11 printf("%d", A[i]); 12 } 13 puts(""); 14} 15 16void Arrange(int A[], int Min, int Max, int Pivot, int *Ret) { 17 int L, R, Tmp; 18 19 L = Min; 20 R = Max; 21 while (L <= R) { 22 Tmp = A[L]; 23 A[L] = A[R]; 24 A[R] = Tmp; 25 while (A[L] < Pivot) { 26 L += 1; 27 } 28 while (A[R] >= Pivot) { 29 R -= 1; 30 } 31 } 32 *Ret = L; 33} 34 35void FindPivot(int A[], int Min, int Max, int *Ret) { 36 int Pivot, K, Found; 37 Pivot = A[Min]; 38 K = Min + 1; 39 *Ret = -1; 40 Found = false; 41 42 while (K <= Max && !Found) { 43 if (A[K] == Pivot) { 44 K += 1; 45 } 46 else { 47 Found = true; 48 49 if (A[K] > Pivot) { 50 *Ret = K; 51 } 52 else { 53 *Ret = Min; 54 } 55 } 56 } 57} 58 59void QuickSort(int A[], int Min, int Max) { 60 int Pivot, J, K, L; 61 debug(A, Min, Max); 62 63 FindPivot(A, Min, Max, &J); 64 if (J > -1) { 65 Pivot = A[J]; 66 Arrange(A, Min, Max, Pivot, &K); 67 L = K - 1; 68 QuickSort(A, Min, L); 69 QuickSort(A, K, Max); 70 } 71} 72 73int main() { 74 int A[10] = {3,5,8,4,0,6,9,1,2,7}; 75 QuickSort(A, 0, 9); 76 return 0; 77}

投稿2022/03/20 16:27

arcxor

総合スコア2859

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

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

Jorrvaskr_prg

2022/03/20 16:50

アルゴリズムの参考書なので実装などは無いのです。このページ前後は設問のみです。 L<Pivot等を無視して二週目に入りもとに戻る、という思考に至りませんでした。 その上でトレースしたところ設問解説通りに進行することができました。 ありがとうございました。
arcxor

2022/03/20 16:56

> アルゴリズムの参考書なので実装などは無いのです そのアルゴリズムが隠されているわ、四角・三角区間の説明は無いわで回答が非常に困難でした。
Jorrvaskr_prg

2022/03/21 09:31

これは煽りでもなんでもなく無知故の疑問なのですが、 アルゴリズムはクイックソートであり特に新たに作られたものではないことと、四角三角は基本情報技術者試験で覚えさせられる擬似コードの記号なので、プログラマーの方々であれば共通認識または既知の情報だと思い特に記載しなかったのですが、そうではないのでしょうか。
arcxor

2022/03/21 10:29

これは興味深い観点ですね。 基本情報技術者試験(情報処理技術者試験の一部である)は日本の国家資格の一つであり、技術者試験としては広く知られたものではあります。しかし、基本情報技術者を受けているプログラマは一部なので知らない人は知らないですし、結局は疑似コードというのは独自言語です。何の脈絡もなく擬似コードを見せられては、その構文の意味するところを理解するのは通常は難しいと思います。記法の説明(あるいは何の疑似コードであるかの明示)なしでは通用しないと思った方が良いと思います。 クイックソートのアルゴリズムについては、例えばピボットの選び方などは様々な流儀があります。特定のピボットの選び方についてアルゴリズムがマスクされていて、そのアルゴリズムの内容を問われても答えるのは難しいのではないかと思います(だからこそエスパーして動作するプログラムを書く必要があった)。 こんなところでしょうか。
Jorrvaskr_prg

2022/03/21 11:22

初心者として学んでいると、業界では普通・基本なので絶対覚えるようにと植え込まれている故の不躾でした。 arcxor様のエスパー力に脱帽です。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問