Quick Sort 計算機アルゴリズム特論 :2017 年度 只木進一

Similar documents
目的 泡立ち法を例に Comparableインターフェイスの実装 抽象クラスの利用 型パラメタの利用 比較 入替 の回数を計測

文字列操作と正規表現

JAVA とテンプレート

新・明解Java入門

1. はじめに 二分木ヒープ 様々なアルゴリズムにおいて ある要素の集合またはリストから 最小 な要素を取り 出す必要がある そのような場合に使われる標準的データ構造が二分木ヒープ (binary heap) である あるオブジェクトO を考える そのオブジェクトは ラベル O. label と値

2. データ構造ヒープに保存するデータは 番号付けられて保存される 従って リスト L として保存することとする 3. アルゴリズム 3.1. 要素の追加新しい要素の追加は リストの終端に置くことで開始する つまり 最下層の一番右 または新たに最下層を生成してその一番左となる この後 この要素を正し

Java演習(4) -- 変数と型 --

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 条件判断文 3 switch 文 switch 文式が case の値と一致した場合 そこから直後の break; までを処理し どれにも一致しない場合 default; から直後の break; までを処理する 但し 式や値 1

K227 Java 2

やさしいJavaプログラミング -Great Ideas for Java Programming サンプルPDF

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 今日の講義講義で学ぶ内容 switch 文 論理演算子 条件演算子 条件判断文 3 switch 文 switch 文 式が case のラベルと一致する場所から直後の break; まで処理しますどれにも一致致しない場合 def

解きながら学ぶJava入門編

ALG ppt


untitled

8 if switch for while do while 2

break 文 switch ブロック内の実行中の処理を強制的に終了し ブロックから抜けます switch(i) 強制終了 ソースコード例ソースファイル名 :Sample7_1.java // 入力値の判定 import java.io.*; class Sample7_1 public stati

グラフの探索 JAVA での実装

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

二分木ヒープとは 集合 リストから 最小な 要素を取り出す 二分木ヒープは そのための標準的データ構造 二分木ヒープを保存するデータ構造 二分木ヒープの操作のメソッド 対象となるデータクラス 識別のためのlabelフィールド 値を保持するvalueフィールド

Java プログラミング Ⅰ 3 回目変 数 今日の講義講義で学ぶ内容 変数とは 変数の使い方 キーボード入力の仕方 変 数 変 数 一時的に値を記憶させておく機能 変数は 型 ( データ型 ) と識別子をもちます 2 型 ( データ型 ) 変数に記憶する値の種類変数の型は 記憶できる値の種類と範囲

CollectionsとLambda式

Java講座

グラフと組み合わせ 課題 7 ( 解答例 ) 2013/5/27 1 列挙 n 個の文字の集合 { } S = a, a,, an の全てからなる文字列 つまり同じ文字を含まない 長さ n の文字列を列挙する 方法を考える 1. 何通りの文字列があるかを答えなさい また そのことが正しい

JavaプログラミングⅠ

問題1 以下に示すプログラムは、次の処理をするプログラムである

10/ / /30 3. ( ) 11/ 6 4. UNIX + C socket 11/13 5. ( ) C 11/20 6. http, CGI Perl 11/27 7. ( ) Perl 12/ 4 8. Windows Winsock 12/11 9. JAV

シミュレーションの簡単な例 GUI 無しのシミュレーションを作る GUI を作る パラメタを設定するデモンストレーションをする 2 オブジェクト指向プログラミング特論

Java (5) 1 Lesson 3: x 2 +4x +5 f(x) =x 2 +4x +5 x f(10) x Java , 3.0,..., 10.0, 1.0, 2.0,... flow rate (m**3/s) "flow

情報処理Ⅰ

ALG ppt

JavaプログラミングⅠ

プログラミングA

問題1 以下に示すプログラムは、次の処理をするプログラムである

Microsoft PowerPoint ppt

Java (9) 1 Lesson Java System.out.println() 1 Java API 1 Java Java 1

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

r02.dvi

ohp02.dvi

Microsoft Word - CompA-Ex doc

JavaプログラミングⅠ

: : : TSTank 2

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

I java A

問 次の Fortran プログラムの説明及びプログラムを読んで、設問に答えよ。

2

明解Javaによるアルゴリズムとデータ構造

「Android Studioではじめる 簡単Androidアプリ開発」正誤表

Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問

226

今回の内容 グラフとオブジェクト指向プログラミング Java を使う理由 Java の基本 Javaのライブラリ 開発 実行 クラスの再利用 クラス継承 抽象クラス 開発の要点

Microsoft Word - NonGenList.doc

2



Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx


(Eclipse\202\305\212w\202\324Java2\215\374.pdf)

6 p.1 6 Java GUI GUI paintcomponent GUI mouseclicked, keypressed, actionperformed mouseclicked paintcomponent thread, 1 GUI 6.0.2, mutlithread C

Java (7) Lesson = (1) 1 m 3 /s m 2 5 m 2 4 m 2 1 m 3 m 1 m 0.5 m 3 /ms 0.3 m 3 /ms 0.6 m 3 /ms 1 1 3

Microsoft PowerPoint - prog09.ppt

Microsoft PowerPoint - prog09.ppt

オブジェクト指向プログラミング・同演習 5月21日演習課題

Javaによるアルゴリズムとデータ構造

r1.dvi

<4D F736F F D2091E F196E291E889F090E C4816A82CC838C E646F6378>

メソッドのまとめ

Java updated

3 Java 3.1 Hello World! Hello World public class HelloWorld { public static void main(string[] args) { System.out.println("Hello World");

Microsoft Word - NonGenTree.doc

IE6 2 BMI chapter1 Java 6 chapter2 Java 7 chapter3 for if 8 chapter4 : BMI 9 chapter5 Java GUI 10 chapter6 11 chapter7 BMI 12 chap

ex01.dvi

Method(C 言語では関数と呼ぶ ) メソッドを使うと 処理を纏めて管理することができる 処理 ( メソッド ) の再実行 ( 再利用 ) が簡単にできる y 元々はC 言語の関数であり 入力値に対する値を 定義するもの 数学では F(x) = 2x + 1 など F(x)=2x+1 入力値 (

プログラミング入門1

そして 取得した OutputStream インスタンスを使い 文字コードは UTF-8 として PrintWriter インスタンスを生成して あとは PrintWriter.append() で書き込みたい文字 列を渡して close() で保存する というだけです ファイルの読込み方法 それで

JavaプログラミングⅠ

デジタル表現論・第4回

tkk0408nari

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版  

untitled

アルゴリズムとデータ構造1

Javaセキュアコーディングセミナー東京 第3回 入出力(File, Stream)と例外時の動作 演習解説

Microsoft PowerPoint - 05.pptx

JavaプログラミングⅠ

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

プログラムの基本構成

31 33

class IntCell { private int value ; int getvalue() {return value; private IntCell next; IntCell next() {return next; IntCell(int value) {this.value =

ex01.dvi

ALG2012-A.ppt

(Java/FX ) Java CD Java version Java VC++ Python Ruby Java Java Eclipse Java Java 3 Java for Everyone 2 10 Java Midi Java JavaFX Shape Canvas C

1 Java Java GUI , 2 2 jlabel1 jlabel2 jlabel3 jtextfield1 jtextfield2 jtextfield3 jbutton1 jtextfield1 jtextfield2 jtextfield3

2

グラフを表すデータ構造 Javaでの実装

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版   None

Java 3 p.2 3 Java : boolean Graphics draw3drect fill3drect C int C OK while (1) int boolean switch case C Calendar java.util.calendar A

新・明解Javaで学ぶアルゴリズムとデータ構造

1: JX-model XML File Package Import Class Intf Ctor Method SInit Field Param Local ExtdOpt ImplOpt ThrwOpt Members QName Type Stmt Label Expr ident li

Java学習教材

Assignment_.java 課題 : 転置行列 / class Assignment_ public static void main(string[] args) int i,j; int[][] array = 1,,,,,,,,,,,,,1,1,; 行 列行列 i

Transcription:

Quick Sort 計算機アルゴリズム特論 :2017 年度 只木進一

2 基本的考え方 リスト ( あるいは配列 )SS の中の ある要素 xx(pivot) を選択 xx より小さい要素からなる部分リスト SS 1 xx より大きい要素からなる部分リスト SS 2 xx は SS 1 または SS 2 に含まれる 長さが 1 になるまで繰り返す pivot xx の選び方として 中央の要素を選択すると効率が良い

3 三つの可能性 pivot を中央の要素とした場合 pivot の両側の入れ替えるべき要素数が同じ場合 : 例 1 pivot の位置より 左側にある移動すべき要素が右側のそれより多い場合 : 例 2 pivot の位置より 左側にある移動すべき要素が右側のそれより少ない場合 : 例 3

4 左端からxx ii xxとなる要素を探す 右端からxx jj xxとなる要素を探す xx ii とxx jj を入れ替える ii < jjである限り繰り返す SS 1 = xx kk 0 kk < ii SS 2 = {xx kk ii kk < SS

5 例 1 基準値 32 45 左端から基準値以上となる最初の要素 (32) の位置 ii 右端から基準値以下となる最初の要素 () の位置 jj 二つの要素を入れ替える ii 45 ii jj 位置 iiから基準値以上となる最初の要素 (45) の位置 ii 位置 jjから基準値以下となる最初の要素 () の位置 jj 二つの要素を入れ替える jj 32

6 ii jj 45 32 位置 ii から基準値以上となる最初の要素 () の位置 ii 位置 jj から基準値以下となる最初の要素 () の位置 jj ii jj となったので ii で分割 45 32 基準値より小さい 基準値以上

7 例 2 基準値 25 ii 32 45 23 左端から基準値以上となる最初の要素 (25) の位置 ii 右端から基準値以下となる最初の要素 () の位置 jj 二つの要素を入れ替える 32 45 23 ii jj 位置 iiから基準値以上となる最初の要素 (32) の位置 ii 位置 jjから基準値以下となる最初の要素 (23) の位置 jj 二つの要素を入れ替える 37 37 jj 25

8 23 45 32 ii jj 位置 iiから基準値以上となる最初の要素 (45) の位置 ii 位置 jjから基準値以下となる最初の要素 () の位置 jj 二つの要素を入れ替える 37 25 23 45 32 37 25 jj ii 位置 ii から基準値以上となる最初の要素 (45) の位置 ii 位置 jj から基準値以下となる最初の要素 () の位置 jj ii jj となったので ii で分割 23 45 32 37 25 基準値以下 基準値より大きい

9 例 3 基準値 12 左端から基準値以上となる最初の要素 () の位置 ii 右端から基準値以下となる最初の要素 (20) の位置 jj 二つの要素を入れ替える 12 ii 20 ii jj 位置 iiから基準値以上となる最初の要素 () の位置 ii 位置 jjから基準値以下となる最初の要素 () の位置 jj 二つの要素を入れ替える 20 jj

12 20 10 jj ii 位置 ii から基準値以上となる最初の要素 () の位置 ii 位置 jj から基準値以下となる最初の要素 () の位置 jj ii jj となったので ii で分割 12 20 基準値より小さい 基準値以上

public T[] dosort() { sortsub(0, data.length); return data; protected void sortsub(int begin, int end) { if (end <= begin + 1) { return; int boundary = partition(begin, end); sortsub(begin, boundary); sortsub(boundary, end);

12 protected int partition(int begin, int end) { int fromleft = begin - 1; int fromright = end; int m = (begin + end) / 2; T v = data[m]; for (;;) { while (less(data[++fromleft], v)); while (less(v, data[--fromright])) { if (fromright == begin) { break; if (fromleft >= fromright) {break; exch(fromleft, fromright); return fromleft;

13 注 :increment/decrement 演 算子 bb = aa + +; aa を bb へ代入後 インクリメント bb =+ +aa; aa をインクリメント後 bb へ代入 while (less(data[++fromleft], v)); v より小さくない要素を見つけるまで fromleft をインクリメント

14 計算量 一回の partition 操作で 要素の比較は nn 回 partitioning は 概ね log 2 nn 回 全体で nnlog 2 nn 回の比較 要素を swap するために 作業領域を必要としない

比較回数

16 入替回数

17 pivot の選択を最後の要素にし た場合 基準値 12 ii 左端から基準値以上となる最初の要素 () の位置 ii 右端から基準値以下となる最初の要素 (20) の位置 jj 二つの要素を入れ替える 20 jj 12 20 ii jj 位置 ii から基準値以上となる最初の要素 () の位置 ii 位置 jj から基準値以下となる最初の要素 () の位置 jj 二つの要素を入れ替える

12 20 位置 ii から基準値以上となる最初の要素 () の位置 ii 位置 jj から基準値以下となる最初の要素 () の位置 jj ii jj となったので ii で分割 jj ii 12 20

QuickSort.java package sort; import java.io.ioexception; import java.util.function.binaryoperator; import static sort.abstractsort.testrun; /** * * @author tadaki * @param <T> */ public class QuickSort<T extends Comparable<T>> extends AbstractSort<T> { //pivot の選び方 public static enum PivotType { Middle, First, Last, Random; public static final boolean debug = false; //pivot を選ぶ関数のデフォルト private BinaryOperator<Integer> getpivot = (begin, end) -> (begin + end) / 2; public QuickSort(T[] data) { super(data); public QuickSort() { /** * pivot を変更する * * @param pivottype */ public void setpivottype(pivottype pivottype) { switch (pivottype) { case First:// 最初の要素 getpivot = (begin, end) -> begin; break; case Last:// 最後の要素 getpivot = (begin, end) -> end - 1; break; case Random:// ランダム getpivot = (begin, end) -> (int) ((end - begin) * Math.random()) + begin; break; 1/3 ページ

QuickSort.java default:// 中央の要素 getpivot = (begin, end) -> (begin + end) / 2; break; @Override public T[] dosort() { sortsub(0, data.length); return data; protected void sortsub(int begin, int end) { if (end <= begin + 1) { return; int boundary = partition(begin, end); sortsub(begin, boundary); sortsub(boundary, end); /** * pivot の値での分割 * * @param begin 配列の開始位置 * @param end 終了位置 : 対象の外側であることに注意 * @return 分割の位置 */ protected int partition(int begin, int end) { int fromleft = begin - 1; int fromright = end; int m = getpivot.apply(begin, end); T v = data[m]; if (debug) { System.out.print("partition (" + begin + "," + end + ") "); System.out.println("with pivot " + v + " at " + m); for (;;) { while (less(data[++fromleft], v)); while (less(v, data[--fromright])) { if (fromright == begin) { break; if (fromleft >= fromright) { break; 2/3 ページ

QuickSort.java if (debug) { System.out.println(data2Str() + ":swap(" + fromleft + "," + fromright + ")"); exch(fromleft, fromright); if (debug) { System.out.println("end paritioning with " + data2str()); return fromleft; /** * 配列の文字列化 * * @return */ private String data2str() { StringBuilder sb = new StringBuilder(); sb.append("["); for (int i = 0; i < data.length - 1; i++) { sb.append(data[i]).append(","); sb.append(data[data.length - 1]).append("]"); return sb.tostring(); /** * @param args the command line arguments * @throws java.io.ioexception */ static public void main(string args[]) throws IOException { if (QuickSort.debug) { Integer[] data = {,, 12,,,,,,,, 20; QuickSort<Integer> qs = new QuickSort<>(data); qs.dosort(); else { int numdata = 1000; Data[] data = Data.createData(numData); testrun(new QuickSort<>(data)); 3/3 ページ