web-dev-qa-db-ja.com

Javascript sort()はどのように機能しますか?

次のコードは、この配列をどのように数値順に並べ替えますか?

var array=[25, 8, 7, 41]

array.sort(function(a,b){
  return a - b
})

計算の結果が...

未満:「a」は「b」よりも低いインデックスになるようにソートされます。
Zero:「a」と「b」は等しいと見なされ、ソートは実行されません。
より大きい:「b」は、「a」よりも低いインデックスにソートされます。

配列のソート中に、配列ソートコールバック関数が何度も呼び出されますか?

もしそうなら、私は毎回2つの数字が関数に渡されることを知りたいです。最初に「25」(a)と「8」(b)を取得し、次に「7」(a)と「41」(b)を取得したと想定しました。

25(a)-8(b) = 17(ゼロより大きいため、 "b"を "a"よりも低いインデックスにソート):8、25

7(a)-41(b)= -34(ゼロ未満なので、「a」を「b」よりも低いインデックスにソートします:7、41

次に、2つの数値セットはどのように相互に関連してソートされますか?

苦労している初心者を助けてください!

75
cw84

配列のソートコールバック関数は、ソート中に何度も呼び出されますか?

はい

その場合、どの2つの数字が毎回関数に渡されるかを知りたい

あなたはあなたの自己を見つけることができます:

array.sort((a,b) => {
  console.log(`comparing ${a},${b}`);
  return a > b ? 1
               : a === b ? 0 
                         : -1;
});

[〜#〜] edit [〜#〜]

これは私が持っている出力です:

25,8
25,7
8,7
25,41
44
OscarRyz

JavaScriptインタープリターには、何らかの種類の ソートアルゴリズム 実装が組み込まれています。ソート操作中に比較関数を何度か呼び出します。比較関数が呼び出される回数は、特定のアルゴリズム、ソートされるデータ、およびソート前の順序によって異なります。

一部のソートアルゴリズムは、通常の場合よりもはるかに多くの比較を行うため、既にソートされたリストでパフォーマンスが低下します。事前にソートされたリストにうまく対処できるものもありますが、パフォーマンスが低下する可能性がある「トリック」が可能な他のケースがあります。

すべての目的に最適な単一のアルゴリズムはないため、一般的に使用されるソートアルゴリズムは多数あります。一般的な並べ替えに最もよく使用される2つは、 Quicksortmerge sort です。クイックソートは多くの場合、2つのうち速い方ですが、マージソートには全体的な選択を改善できるニースのプロパティがいくつかあります。マージソートは stable ですが、クイックソートはそうではありません。両方のアルゴリズムは並列化できますが、マージソートの動作方法により、並列実装がより効率的になり、他のすべてが同等になります。

特定のJavaScriptインタープリターは、これらのアルゴリズムのいずれかまたは他の何かを完全に使用する場合があります。 ECMAScript standard どのアルゴリズムを指定しない 適合実装が使用する必要があります。安定性の必要性を明確に否定します。

37
Warren Young

値のペアが一度に1ペアずつ比較されます。比較されるペアは実装の詳細です。すべてのブラウザで同じであると想定しないでください。コールバックは何でもかまいません(したがって、ストリング、ローマ数字、または1,0、-1を返す関数を思いつくことができる他のものをソートできます)。

JavaScriptの種類について留意すべきことの1つは、JavaScriptが安定しているとは限らないということです。

10
Nosredna

配列のソートコールバック関数は、ソート中に何度も呼び出されますか?

はい、それだけです。コールバックは、配列内の要素のペアを必要に応じて比較して、それらの順序を決定するために使用されます。比較関数のその実装は、数値ソートを処理する場合に非定型ではありません。詳細は 仕様 または 一部 その他 読みやすい サイトにあります。

5
T.J. Crowder

配列のソート中に、配列ソートコールバック関数が何度も呼び出されますか?

これは比較ソートであるため、N個のアイテムが与えられると、コールバック関数は Quicksort のような高速ソートのために平均(N * Lg N)回呼び出される必要があります。使用されるアルゴリズムが Bubble Sort のようなものである場合、コールバック関数は平均(N * N)回呼び出されます。

比較ソートの最小呼び出し回数は(N-1)であり、すでにソートされたリストを検出するためだけです(つまり、スワップが発生しない場合は、バブルソートの早い段階で)。

4
Adisak

このコードを実行します。最初から最後までステップごとに正確な手順を確認できます。

var array=[25, 8, 7, 41]
var count = 1;
array.sort( (a,b) => { 
console.log(`${count++}). a: ${a} | b: ${b}`);
return a-b;
});
console.log(array);
0
Tinu Mathai