117

次のコードは、この配列を数値順にソートする方法を教えてください。

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

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

計算の結果が...

0 未満: "a" は "b" よりも低いインデックスになるように並べ替えられます。
ゼロ: "a" と "b" は等しいと見なされ、並べ替えは実​​行されません。
0 より大きい: "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 (0 未満なので、"a" を "b" よりも小さいインデックスになるように並べ替える: 7, 41

2 組の数値は、相互にどのように並べ替えられますか?

困っている初心者を助けてください!

4

7 に答える 7

58

並べ替えの過程で配列並べ替えのコールバック関数が何度も呼び出されていませんか?

はい

もしそうなら、毎回どの2つの数値が関数に渡されるか知りたいです

次の方法で自分自身を見つけることができます。

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

編集

これは私が得た出力です:

25,8
25,7
8,7
25,41
于 2009-09-29T20:27:34.753 に答える
48

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

一部の並べ替えアルゴリズムは、通常の場合よりもはるかに多くの比較を行うため、既に並べ替えられたリストではうまく機能しません。事前にソートされたリストにうまく対処できるものもありますが、「だまされて」パフォーマンスが低下する場合があります。

単一のアルゴリズムがすべての目的に完全ではないため、一般的に使用される並べ替えアルゴリズムは多数あります。一般的な並べ替えに最もよく使用される 2 つは、Quicksortmerge sortです。多くの場合、2 つのうちクイックソートの方が高速ですが、マージ ソートにはいくつかの優れた特性があり、全体的な選択肢として優れています。マージソートは安定していますが、クイックソートはそうではありません。どちらのアルゴリズムも並列化可能ですが、マージ ソートが機能する方法により、並列実装がより効率的になり、他のすべてが同等になります。

特定の JavaScript インタープリターは、これらのアルゴリズムのいずれかを使用する場合もあれば、まったく別のものを使用する場合もあります。ECMAScript標準では、準拠する実装で使用する必要があるアルゴリズムは指定されていません。それは、安定の必要性を明確に否定しています。

于 2009-09-29T20:27:05.373 に答える
13

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

JavaScript のソートで注意すべきことの 1 つは、安定性が保証されていないことです。

于 2009-09-29T20:32:47.713 に答える
6

並べ替えの過程で配列並べ替えのコールバック関数が何度も呼び出されていませんか?

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

于 2009-09-29T20:26:42.940 に答える
4

並べ替えの過程で配列並べ替えのコールバック関数が何度も呼び出されていませんか?

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

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

于 2009-09-29T20:35:47.727 に答える