1 2005 715 sakai keiichikochitech ac jp http

  • Slides: 18
Download presentation
アルゴリズムとデータ構造 1 2005年 7月15日 酒居敬一(sakai. keiichi@kochi-tech. ac. jp) http: //www. info. kochi-tech. ac. jp/k

アルゴリズムとデータ構造 1 2005年 7月15日 酒居敬一(sakai. keiichi@kochi-tech. ac. jp) http: //www. info. kochi-tech. ac. jp/k 1 sakai/Lecture/ALG 2/005/index. html

バブルソート 10 8 10 15 10 3 15 15 32 15 5 15 32

バブルソート 10 8 10 15 10 3 15 15 32 15 5 15 32 3215 12 32 12 1 32 24 6 24 > > 38 10 < < > > > > 16 > < 38 10 83 10 12 1 32 15 24 32 10 3 10 15 5 15 12 5 15 32 12 16 32 15 61 32 6 24 5 入れ替え 入れ替えない 入れ替えない 入れ替え 残りも同様に整列させると… 1 3 5 6 8 10 12 15 24 32 整列済み

public final class Bubble. Sort { public static void sort(int[] any. Target. Integers) {

public final class Bubble. Sort { public static void sort(int[] any. Target. Integers) { if(null == any. Target. Integers){ throw new Null. Pointer. Exception(); } Bubble. Sort. print(any. Target. Integers); boolean is. Changed = false; int limit = any. Target. Integers. length - 1; while(true){ is. Changed = false; for(int count = 0; count < limit; count++){ if(any. Target. Integers[count] > any. Target. Integers[count+1]){ int temp = any. Target. Integers[count]; any. Target. Integers[count] = any. Target. Integers[count+1]; any. Target. Integers[count+1] = temp; is. Changed = true; } } --limit; Bubble. Sort. print(any. Target. Integers); if(!is. Changed){ 配列要素どおしの入れ替えが無くなれば終了 break; } }

public static void print(int[] any. Target. Integers) { int limit = any. Target. Integers.

public static void print(int[] any. Target. Integers) { int limit = any. Target. Integers. length - 1; for(int count = 0; count < limit; count++){ if(10 > any. Target. Integers[count]){ System. out. print(" "); } System. out. print(any. Target. Integers[count] + ", "); } System. out. println(any. Target. Integers[limit]); } public class Bubble. Sort. Test // テスト用プログラム { public static void main(String[] any. Arguments) { int[] int. Array = {47, 18, 8, 7, 2, 4, 9, 0, 72, 88, 2, 5, 9, 10}; Bubble. Sort. sort(int. Array); [sakai@star 11]$ java Bubble. Sort. Test } 47, 18, 8, 7, 2, 4, 9, 0, 72, 88, } 18, 8, 7, 2, 4, 9, 0, 47, 72, 2, 8, 7, 2, 4, 9, 0, 18, 47, 2, 5, 7, 2, 4, 8, 0, 9, 18, 2, 5, 9, 2, 4, 7, 0, 8, 9, 2, 5, 9, 10, 2, 4, 0, 7, 8, 2, 5, 9, 9, 10, 2, 0, 4, 7, 2, 5, 8, 9, 9, 10, 0, 2, 4, 2, 5, 7, 8, 9, 9, 10, 0, 2, 2, 4, 5, 7, 8, 9, 9, 10, [sakai@star 11]$ 2, 5, 9, 10, 18, 18, 18, 5, 9, 10, 47, 47, 9, 10, 72, 72, 10 88 88 88

public final class Quick. Sort { public static void print(int[] any. Target. Integers) {

public final class Quick. Sort { public static void print(int[] any. Target. Integers) { int limit = any. Target. Integers. length - 1; for(int count = 0; count < limit; count++){ if(10 > any. Target. Integers[count]){ System. out. print(" "); } System. out. print(any. Target. Integers[count] + ", "); } System. out. println(any. Target. Integers[limit]); } public static void sort(int[] any. Target. Integers) { if(null == any. Target. Integers){ throw new Null. Pointer. Exception(); } Quick. Sort. sort(any. Target. Integers, 0, any. Target. Integers. length -1); } }

private static int get. Pivot(int[] any. Target. Integers, int a. Start, int an. End)

private static int get. Pivot(int[] any. Target. Integers, int a. Start, int an. End) { int left = any. Target. Integers[a. Start]; int middle = any. Target. Integers[a. Start + ((an. End - a. Start)/2)]; int right = any. Target. Integers[an. End]; if((left < middle) && (middle < right)){ return middle; } if((left > middle) && (middle > right)){ return middle; } if((left < right) && (right < middle)){ return right; } if((left > right) && (right > middle)){ return right; } if((right < left) && (left < middle)){ return left; } できれば、最大値や最小値を避けたい。 そこで、候補として左端・中央・右端を選択し、実際にどれを基準値にするか? このとき、3個のデータの並び(6通り)を考えて、3個のデータの中央値をとる。

private static void sort(int[] any. Target. Integers, int a. Start, int an. End) {

private static void sort(int[] any. Target. Integers, int a. Start, int an. End) { int range = an. End - a. Start; if(3 > range){ /* 要素数が少ないとき(要素数 3以下)、別の方法でソート */ } int pivot = Quick. Sort. get. Pivot(any. Target. Integers, a. Start, an. End); int temp = 0; for(; left < right; left++){ int left = a. Start; if(pivot <= any. Target. Integers[left]){ int right = an. End; break; while(true){ } /* 入れ替える要素を探します */ } if(left < right){ for(; left < right; right--){ /* 要素を入れ替え、 if(pivot >= any. Target. Integers[right]){ 基準値に従って分けます */ break; }else{ } break; } } } Quick. Sort. sort(any. Target. Integers, a. Start, left -1); Quick. Sort. sort(any. Target. Integers, left +1, an. End); Quick. Sort. print(any. Target. Integers); }

if(2 == range){ /* 要素数が3の場合はバブルソート */ if(any. Target. Integers[a. Start] > any. Target. Integers[a.

if(2 == range){ /* 要素数が3の場合はバブルソート */ if(any. Target. Integers[a. Start] > any. Target. Integers[a. Start+1]){ int temp = any. Target. Integers[a. Start]; any. Target. Integers[a. Start] = any. Target. Integers[a. Start+1]; any. Target. Integers[a. Start+1] = temp; } if(any. Target. Integers[a. Start+1] > any. Target. Integers[an. End]){ int temp = any. Target. Integers[a. Start+1]; any. Target. Integers[a. Start+1] = any. Target. Integers[an. End]; any. Target. Integers[an. End] = temp; } if(any. Target. Integers[a. Start] > any. Target. Integers[a. Start+1]){ int temp = any. Target. Integers[a. Start]; any. Target. Integers[a. Start] = any. Target. Integers[a. Start+1]; any. Target. Integers[a. Start+1] = temp; } }else if(1 == range){ /* 要素数が2の場合は比較して入れ替え */ if(any. Target. Integers[a. Start] > any. Target. Integers[an. End]){ int temp = any. Target. Integers[a. Start]; any. Target. Integers[a. Start] = any. Target. Integers[an. End]; any. Target. Integers[an. End] = temp; } } Quick. Sort. print(any. Target. Integers); return;

if(pivot == any. Target. Integers[left]){ temp = any. Target. Integers[left]; any. Target. Integers[left] =

if(pivot == any. Target. Integers[left]){ temp = any. Target. Integers[left]; any. Target. Integers[left] = any. Target. Integers[right]; any. Target. Integers[right] = any. Target. Integers[left+1]; 基準値を右へ any. Target. Integers[left+1] = temp; 1つ移動 left++; }else if(pivot == any. Target. Integers[right]){ 基準値が右側に temp = any. Target. Integers[right]; any. Target. Integers[right] = any. Target. Integers[left]; 含まれる場合 any. Target. Integers[left] = any. Target. Integers[right-1]; any. Target. Integers[right-1] = temp; 基準値を左へ right--; 1つ移動 }else{ temp = any. Target. Integers[left]; any. Target. Integers[left] = any. Target. Integers[right]; 基準値がどちらにも any. Target. Integers[right] = temp; 含まれない場合 left++; right--; 単純に入れ替え } 基準値が左側に 含まれる場合

public class Quick. Sort. Test { public static void main(String[] any. Arguments) { int[]

public class Quick. Sort. Test { public static void main(String[] any. Arguments) { int[] int. Array = {47, 18, 8, 7, 2, 4, 9, 0, 72, 88, 2, 5, 9, 10}; Quick. Sort. sort(int. Array); } } [sakai@star 11]$ java Quick. Sort. Test 47, 18, 8, 7, 2, 4, Pivot = 10 9, 5, 8, 7, 2, 4, Pivot = 9 2, 5, 8, 7, 2, 4, Pivot = 2 0, 2, 2, 7, 8, 4, Pivot = 5 0, 2, 2, 4, 5, 8, 0, 2, 2, 4, 5, 7, Pivot = 72 0, 2, 2, 4, 5, 7, [sakai@star 11]$ 9, 9, 8, 8, 8, 0, 72, 88, 2, 5, 9, 10 0, 2, 10, 88, 72, 18, 47 0, 9, 10, 88, 72, 18, 47 5, 9, 10, 88, 72, 18, 47 7, 9, 10, 88, 72, 18, 47 9, 9, 10, 47, 18, 72, 88 9, 9, 10, 18, 47, 72, 88

public final class Bin. Sort { public static void sort(int[] any. Target. Integers, int

public final class Bin. Sort { public static void sort(int[] any. Target. Integers, int a. Min, int a. Max) { if(null == any. Target. Integers){ throw new Null. Pointer. Exception(); } Bin. Sort. print(any. Target. Integers); int[] bin = new int[a. Max - a. Min + 1]; for(int i = 0; i < bin. length; i ++){ bin[i] = 0; } int[] original = (int [])any. Target. Integers. clone(); for(int i = 0; i < original. length; i++){ bin[original[i] - a. Min]++; int[] original = new int[any. Target. Integers. length]; } for(int i = 0; i < any. Target. Integers. length; i++){ for(int i = 1; i < bin. length; i ++){ original[i] = any. Target. Integers[i]; bin[i] += bin[i-1]; } } for(int i = original. length-1; i >= 0; i--){ int j = --bin[original[i] - a. Min]; any. Target. Integers[j] = original[i]; } Bin. Sort. print(any. Target. Integers);

public static void print(int[] any. Target. Integers) { int limit = any. Target. Integers.

public static void print(int[] any. Target. Integers) { int limit = any. Target. Integers. length - 1; for(int count = 0; count < limit; count++){ if(10 > any. Target. Integers[count]){ System. out. print(" "); } System. out. print(any. Target. Integers[count] + ", "); } System. out. println(any. Target. Integers[limit]); } [sakai@star 11]$ java Bin. Sort. Test 47, 18, 8, 7, 2, 4, 9, 0, 72, 88, 2, 5, 9, 10 0, 2, 2, 4, 5, 7, 8, 9, 9, 10, 18, 47, 72, 88 [sakai@star 11]$ ビンに仕分けて、取り出すだけ。 時間計算量は良い。 空間計算量は良くない。