Javaでクイックソート(quicksort)
クラスQuickSortは状態(ステート,state)を持たないから、インスタンス化する必要がないかも。
メソッドをstaticで書きなおしていい気がする。
それにしてもJavaはコードが長くなる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
import java.util.*; public class Main { public static void main(String[] args) throws Exception { QuickSort q = new QuickSort(); int size = 20; int[] a = new int[size]; q.setRandomForArray(a); dispArrayLine(a); q.quicksort(a); dispArrayLine(a); } public static void dispArrayList(int[] a){ for(int i=0; i<a.length; i++){ System.out.println(i + " => " + a[i]); } } public static void dispArrayLine(int[] a){ for(int i=0; i<a.length; i++){ System.out.print(a[i] + " "); } System.out.println(); } } class QuickSort { public Random mRandom; public QuickSort(){ this.mRandom = new Random(); } public int getRandomInt(int min, int max){ return min + this.mRandom.nextInt(max-min+1); } public void setRandomForArray(int[] a, int min, int max){ for(int i=0; i<a.length; i++){ a[i] = this.getRandomInt(min, max); } } public void setRandomForArray(int[] a){ int min = 0; int max = 9; this.setRandomForArray(a, min, max); } public void swap(int[] a, int l, int r){ int t = a[l]; a[l] = a[r]; a[r] = t; } public int getPivot(int a, int b, int c){ if(a>b){ if(b>c){ return b; }else{ return a>c?c:a; } }else{ if(a>c){ return a; }else{ return b>c?c:b; } } } public void quicksort(int[] a, int left, int right){ if(right<=left){ return; } int l = left; int r = right; int p = this.getPivot(a[l], a[l+1], a[r]); while(true){ while(a[l]<p){ l++; } while(p<a[r]){ r--; } if(r<=l){ break; } this.swap(a,l,r); l++; r--; } this.quicksort(a, left, l-1); this.quicksort(a, r+1, right); } public void quicksort(int[] a){ int left = 0; int right = a.length-1; this.quicksort(a, left, right); } } |