クイックソートの再帰と非再帰の2つの実装
1つの パッケージcom.ebiz.sort。 2 3 インポートjava.text.SimpleDateFormatの。 4 インポートjava.util.Arrays。 5 輸入java.util.Date; 6 インポートjava.util.Stackを。 7 8 / ** 9 * @author YHJ 10 * @Create 2019年8月18日午前17時42分 11 * / 12 パブリック クラスクイック{ 13 14 公共 静的 ボイドメイン(文字列[]引数){ 15 のint [] ARR = 新しいです int型[8 ]。 16 のために(int型 i = 0; iが8 <; Iは++ ){ 17の ARR [I] =(INT)(Math.random()* 800000 )。 18 } 19 20 文字列S = 新しいてSimpleDateFormat( "YYYY-MM-DD HH:MM:SS")形式(新しい日付())。 21 のSystem.out.println( "排序前=" + S)。 22 23 クイックソート(ARR、0、arr.length-1 )。 24 25 26 列L = 新しいてSimpleDateFormat( "YYYY-MM-DD HH:MM:SS")。フォーマット(新DATE()); 27 のSystem.out.println(+ "=ソート" L); 28 } 29 30 / ** 31である *クイック(再帰的に) 32 * <P> 33である *①列の数から選びます。 「ベンチマーク」(ピボット)として知られている要素、。 34 *②。、列の順序を変更すべてのベースラインの背後に配置された要素の基準値(同じ番号はどちら側でもよい)より全て大きい、基部の前方に配置された基準値要素よりも小さいです。パーティションの終了後に、参照列の数の中間にあります。これは、パーティション(パーティション)動作と呼ばれます。 35 基準値よりも*③。再帰的(再帰的に)列の数とサブ要素は、列の数要素のソート基準値よりも大きいです。 36 * 37 * @paramの配列ソートするARR 38である * @param 左低境界 39 * @param 高右境界 40 * / 41 公共 静的 ボイドクイック(INT [] ARR、INT低い、INT 高い){ 42 であれば(arr.length <= 0 ){ 43 リターン。 44 } 45 であれば(ロー> = {ハイ) 46 リターン。 47 } 48 INTの左= 低いです。 49 INT =右高いです。 50 51 INT一時=のARR [左]。 // 挖坑1:保存基准的值 52 しばらく(<左、右){ 53は 、一方(= <右&& ARR [右]> TEMPを左){ // ピット2:ピットの基準位置に挿入され、後方から前方に基準素子よりも小さい見出さ1。 54が 右- 。 55 } 56で ARR [左] = ARR [右]; 57れる 一方(左<右&& ARR [左] <= TEMP){ // ピット3:背面にフロントピットに、基準要素より大きい見出さだけ掘っ2 58 ++を左; 59 } 60 ARR [右] = ARR [左]; 61である } 62で ARR [左] = TEMP; // ピット3を充填するための基準値、準備されたパーティション再帰速い行 63である のSystem.out.println( "ソート:" + Arrays.toStringの(ARR)); 64 クイック(ARR、低は、左- 1。); 65 クイック(ARR、左+ 1 、高); 66 } 67 / ** 68 *クイックソート(非再帰) 69 * 70 *の①は、カラムからの要素の数、いわゆる「ベンチマーク」(ピボット)を選び出し。 71 *②。、列の順序を変更すべてのベースラインの背後に配置された要素の基準値(同じ番号はどちら側でもよい)より全て大きい、基部の前方に配置された基準値要素よりも小さいです。パーティションの終了後に、参照列の数の中間にあります。これは、パーティション(パーティション)動作と呼ばれます。 72 ステップ②、保存するスタックにプッシュ2つの境界部(低及び高)を分割し、サイクル①後*③。 73である * @paramの配列ソートするARR 74 * / 75 公開 静的 ボイド quickSortByStack(INT [] ARR){ 76 IF(arr.length <= 0 ){ 77 リターン; 78 } 79 スタック<整数> =スタック新しい新しいスタック<整数> (); 80 81 // 約初期状態ポインタスタック 82 stack.push(0 ;) 83 - stack.push(arr.length 1 ;) 84 しばらく(!{stack.isEmpty()) 85 INTハイstack.pop =(); // スタックのうち分割する 86 int型 =低stack.pop(); 87 88 INT pivotIdx = パーティション(ARR、低、高)。 89 90 // 保存中间变量 91 であれば(pivotIdx> ロー){ 92 stack.push(低いです) 93 stack.push(pivotIdx - 1 )。 94 } 95 であれば(pivotIdx <高い&& pivotIdx> = 0 ){ 96 stack.push(pivotIdx + 1 )。 97 stack.push(高いです) 98 } 99 } 100 } 101 102 プライベート 静的 int型のパーティション(INT [] ARR、INT低、INT ハイ){ 103 IF(arr.length <= 0 ){ 104 リターン -1 ; 105 } 106 IF(低> = High)の{ 107 リターン -1 。 108 } 109 INTの L = 低; 110 INTの R&LT = 高; 111 112 INTピボットARR = [L]; //は1を掘り:記憶された基準値 113 しばらく(L < R&LT){ 114 ながら(L <R&LT && ARR [R&LT]> =ピボット){ // ピット2:ピットの基準位置に挿入され、後方から前方に基準素子よりも小さい見出さ1。 115 r--の。 1 16 } 117 ARR [L] = ARR [R&LT]; 1 18は 、一方(L <R&LT && ARR [L] <=ピボット){ // ピット3:背面にフロントピットに、基準要素より大きい見出さだけ掘っ2 119 L ++ ; 120 } 121 ARR [R&LT] = ARR [L]; 122 } 123 ARR [L] =ピボット; // ピット3を充填するための基準値、再帰的なパーティションが準備高速行 124 戻りL。 125 } 126 127 128 }