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 }