0

したがって、配列が与えられた場合、カスタム比較関数を使用して並べ替えることができることを理解しています。

したがって、Javascript では次のようになります。

var arr = [5,4,3,6,7,2];
arr.sort(function(a,b){
    if (a < b)
        return -1;
    else if (a > b)
        return 1;
    else
        return 0;
});

したがって、私の友人は、このシナリオのリストをソートするために 0 を返す必要はないと言っていました。[true,false]さらに、 から戻るのではなく、から戻ることができると彼は言い[-1,0,1]ます。本当?私は彼の主張に対する反例を見つけようとしましたが、できませんでした。彼のコードを使用して配列が適切にソートされないケースは想像できません。

これが私の友人が与えた例です:

var arr = [5, 4, 3, 6, 7, 2];
arr.sort(function(a, b) {
    return a > b;
});

の範囲から戻るのは良い習慣[-1,0,1]ですか? 整数が比較可能である場合、何が必要ですか? これは、javascript だけでなく、多数のプログラミング言語に当てはまることに気付きました。Cのこの例のように。

4

2 に答える 2

1

いいえ、それは良い習慣ではありません。言語仕様に従う必要があります。言語仕様では、比較関数は、最初の要素が 2 番目の要素よりも大きい場合は正の値を返し、最初の要素が 2 番目の要素よりも小さい場合は負の値を返す必要があると述べています。等しい場合は 0。

あなたがしていることは、いくつかの実装ではうまくいくかもしれませんが、移植性はありません。と を返すtrueと、それぞれとfalseに強制される可能性があります。また、要素 A が要素 B よりも大きいかどうかを知るだけでよいソート アルゴリズムもあります (たとえば、Common Lisp 言語では、その関数がブール比較関数を取るように指定されているため、実装でそのようなアルゴリズムを使用する必要があることは明らかです)。結果が得られることがあります。しかし、実装がトライステート ロジックに依存している場合、それは機能しません。つまり、それらの要素が同等であると見なされるか、正しく順序付けされない可能性があります。10SORTfalse0

于 2013-09-27T00:37:39.550 に答える