クイックソートのアルゴリズム(再帰と非再帰)

クイックソートの再帰と非再帰の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 }

 

おすすめ

転載: www.cnblogs.com/jiushixihuandaqingtian/p/11449371.html