マージソート - 非再帰再帰javaの

1.マージソートのアイデア:

2ウェイマージは、例えば、n個の記録nの配列は二十から二は、長さ1又は2れるのN / 2(切り上げ)にマージ長さ1の順序付けられたシーケンスとみなすことができますレコードの奇数、マージは、Nの順序付けられたシーケンスの長さまで繰り返されるモチーフ配列、。

複雑さの2.マージソート:

再帰:時間複雑性O(nlongn)、Oの空間的複雑さ(N- + longn

非再帰:時間複雑性O(nlongn)、Oの空間的複雑度(N-

だから、優先順位を付けるか、非再帰的、マージソートを使用しています。

 3.再帰

1      公共 ボイド mergeSort1(INT []データ){
 2          msort(データ、0、-data.length 1。);
 3      }
 4  
。5      公共 ボイド msort(INT []データは、int型スタート、int型エンド){
 6を         IF(スタート< エンド){
 7。             INT MID =(スタート+エンド)>>> 1。;
 。8              msort(データ、スタート、MID)
 。9              。msort(データ、+ MID 1端); // 中間+ 1 ==終了時刻であれば、マージに長さ1の配列、出口msort、(ソート)
10              マージ(データ、スタート、MID、エンド)
 。11         }
 12である     }
 13である 
14      公共 ボイドマージ(INT []データは、INTスタート、int型 MID、int型エンド){
 15          INT S1 =スタート;      // データ1 []出発添字のシーケンス
16          INT S2 = MID + 1;   // 配列[]における2データは、開始インデックスである
。17          INT [] TMP = 新しい新しい INT [エンド- + +1を開始];
 18は、         INTインデックス= 0; // インデックスtmpが一時配列である
。19          一方(( S1 <= MID)&&(S2 <=終了)){ // 2つの配列はまだ完全には挿入されないTMP []で
20             IF(データ[S1] <データ[S2])TMP [インデックス++] =データ[S1 ++ ];
 21は、             他の TMP [インデックス++] =データ[S2 ++ ;]
 22である         }
 23は         、一方(S1 <= MID){ // 2 S1自体が順序付けられているので配列は、残りの要素は直接S1に、TMPに完全であった
24              [インデックスが++] =データ[S1 ++ TMP ;]
 25          }
 26は         、一方(S2 <= エンド){
 27              [TMP ++インデックス] =データ[S2 ++ ];
 28          }
 29          のためにINT I = 0;私はtmp.lengthを<; I ++は){
 30個の              データ[スタート++] = tmpが[I]は、
 31であります         }
 32      }

 

4.非再帰

1     公共 ボイド mergeSort2(INT []データ){
 2          のint K = 1 ;   // Kは、長配列である、二つの配列の各ウェイマージ処理を、K <data.lengthはそう
3。 一方、(K < data.length ){ 4 マージ(データ、K); 5 K * = 2 ; 6 } 7。 } 8。 9。 公共 ボイドマージ(INT []データ、INT LEN){ 10 INT S1 = 0 ; 11 INT。E1 = S1 + len- 1 12である INT S2 = E1 + 1。; 13 INT E2 = S2 + 1-lenを<data.length?S2 + LEN-1:data.length-1 ; 14 INT [] TMP = 新しい INT [data.length]。 15 int型のインデックス= 0 16 一方(S2 <data.length){ // 第一种情况存在两个序列 17 ながら((S1 <= E1)&&(S2 <= E2)){ 18 であれば(データ[S1] <データ[S2] )TMP [インデックス++] =データ[S1 ++ ]。 19 TMP [インデックス++] =データ[S2 ++ ]。 20 } 21 ながら(S1 <= E1){ 22 TMP [インデックス++] =データ[S1 ++ ]; 23である } 24 ながら(S2 <= E2){ 25 TMP [インデックス++] =データ[S2 ++ ]; 26である } 27 。S1 = E2 + 1; //は、二つのサブ次のグループを処理しますシーケンス 28 E1 = S1 + LEN -1 ; 29 S2 = E1 + 1 ; 30 E2 = S2 LEN + - 1 <S2 + LEN data.length -1 :? data.length -1。 31である } 32 ながら(S1 <データ.LENGTH){ // 第二の場合、唯一の配列 33 TMP [インデックス++] =データ[S1 ++ ]。 34 } 35 のためのint型、iはdata.lengthを<; I = 0 iは++ ){ 36個 のデータは[I] = TMPを[I]。 37 } 38 }

 

おすすめ

転載: www.cnblogs.com/leechee9/p/11785562.html