高速なソートアルゴリズムの詳細な分析

プロジェクトはその後、徹底的に分析するために、初めて(たぶん忘れ、前に学んだ)このアルゴリズムを参照するために、私は非常に興味深い感じ、アルゴリズムを見て眠く見るために文書を見て、棚上げされました。

最初のステップは、最初の数式トラバーサル(ここでは、他の時間のかかる操作が唯一の時間のかかる操作トラバーサルではないことを仮定して)の数に後退で、2つのクイックソートに分かれています。

次いで、ランクの数は、通常のn * n-1の横断する、トラバースの数は2つに分割され、N + M×(M - 1)+(N - M - 1)×(N - M - 2)1 <M < n]は、

後で、この式を説明する、N Mは、最初のセグメントの長さを表し、二段階の通常ソートの後ろの前にパケットです。

(N * N-1) - (N + M×(M - 1)+(N - M - 1)×(N - M - 2)1 <M <N)= Mの* M - 2 *( N - 1)*(M + 2)

この式は、それほどのコードで右または直接、話すこと、苦いと難しいの周りああ周りを導き出すことを証明していない、ゼロ未満である一定のようだが、ここでは他の時間のかかる操作を無視します:

「パフォーマンス・今」から今の輸入; 

ソートする配列を生成// 
CONSTをoriginArray = []; 
constの最大= 10; 
(; K <マックス; K = 0をkを++){ため
  originArray [K] = Math.floor(Math.random()* MAX)+ 1。
} 
はconsole.log( "起源アレイ"、JSON.stringify(originArray))。
console.log(); 

constのLEN = originArray.length。
normalSort = []、クイックソート= []、normalTimes = 0、quickTimes = 0ましょう。

今のvar T0 =(); 
//通常のソート方法
normalSort = Array.from(originArray)。
{(; iがLEN <I ++は、I = 0せて)ため
  (J = I + 1せ; J <LEN; J ++){ため
    normalTimes ++。
    IF(normalSort [I] <normalSort [J]){ 
      TEMP = normalSort [I]をましょう。
      normalSort [I] = normalSort [J]。
      normalSort [J] = TEMP。
    } 
  } 
} 

今のvar T1 =(); 

//クイックソート方法
CONST半= Math.floor(LEN / 2)。
rightPartを聞かせて= []; 
以下のために(; iはi = 0させ<LEN; iは++){ 
  IF(originArray [I]> originArray [半]){ 
    quickSort.push(originArray [I])。
  }他{ 
    rightPart.push(originArray [I])。
  } 
} 
CONST splitLen = quickSort.length。
クイック= quickSort.concat(rightPart)。
{(; iがsplitLenを<I ++は、I = 0せて)ため
  (J = I + 1せ; J <splitLen; J ++){ため
    quickTimes ++。
    IF(クイック[I] <クイック[J]){
      聞かせて温度=クイックソート[i]は、
      クイック[I] =クイック[J]。
      クイック[J] = TEMP。
    } 
  } 
} 
{(; iがLEN <I ++は、I = splitLenを聞かせて)ため
  (J = I + 1せ; J <LEN; J ++){ため
    quickTimes ++。
    IF(クイック[I] <クイックソートは、[J]){ 
      せTEMP =クイック[I]。
      クイック[I] =クイック[J]。
      クイック[J] = TEMP。
    } 
  } 
} 
今のvar T2 =(); 

console.log( "ノーマルソート結果"、JSON.stringify(normalSort)); 
console.log( "クイックソート結果"、JSON.stringify(クイックソート)); 
console.log();

; -にconsole.log(T0)+ "ミリ秒のループ回数" + normalTimes +(T1 "をNormalSortがかかりました")
; -にconsole.log(T1)+ "ミリ秒ループ回数" + quickTimes +(T2を"クイックソートがかかりました")

以下は、配列の長さ10、100、...実行時間に相当します。

 

1000年、別に、わかるように少し遅い、他の回では、速度の利点は明らかであるとき。

 

おすすめ

転載: www.cnblogs.com/jerryqi/p/11468428.html