質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.40%

  • JavaScript

    21456questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

[JavaScript]配列のソートに関して

受付中

回答 3

投稿

  • 評価
  • クリップ 3
  • VIEW 74

hati_32

score 0

前提・実現したいこと

数値が格納された配列を昇順(降順)に並べ替える際に、ソートメソッドの引数に比較関数を
記述するかと思うのですが、中でどういう処理がされているのかが分かりません。
そのため、具体的にどういう順序でソートされているのかを知りたいです。

試したこと

比較関数内の値を確認してみたが、比較されている値を上手く追えない。

該当のソースコード

let testNumber = [10, 4, 8, 1];
testNumber.sort(function(now, pre){
  console.log("第一引数: " + now);
  console.log("第二引数: " + pre);
  let comp = now - pre;
  if (comp < 0){
    console.log("第一引数の方が小さいので、第一引数のインデックスを第二引数より前に移動させる");
  }
  else{
    console.log("第一引数の方が大きいので、第二引数のインデックスを第一引数より前に移動させる");
  }
  return now - pre;
})
console.log(testNumber);
第一引数: 4
第二引数: 10
第一引数の方が小さいので、第一引数のインデックスを第二引数より前に移動させる

第一引数: 8
第二引数: 4
第一引数の方が大きいので、第二引数のインデックスを第一引数より前に移動させる

第一引数: 8
第二引数: 10
第一引数の方が小さいので、第一引数のインデックスを第二引数より前に移動させる

第一引数: 8
第二引数: 4
第一引数の方が大きいので、第二引数のインデックスを第一引数より前に移動させる

第一引数: 1
第二引数: 8
第一引数の方が小さいので、第一引数のインデックスを第二引数より前に移動させる

第一引数: 1
第二引数: 4
第一引数の方が小さいので、第一引数のインデックスを第二引数より前に移動させる

[1, 4, 8, 10]

分かりやすく教えていただけると嬉しいです。
何卒、よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yasutomi

    2019/07/11 21:09

    すでに答えが質問に書かれているのに
    何がわからないのか理解できませんでした。

    キャンセル

  • hati_32

    2019/07/11 21:14

    比較されている値の順序がよく分かりません・・・。
    4と10が比較された後、8と10が比較されるのは分かるのですが、8と10...1と4となるのは何故なのでしょうか。途中経過の配列を確認しようとしたのですが、上手くできませんでした。

    キャンセル

回答 3

+1

比較されている値の順序がよく分かりません・・・。
4と10が比較された後、8と10が比較されるのは分かるのですが、8と10...1と4となるのは何故なのでしょうか。

比較関数を呼び出す順番に関しては、何も決まっていません。ソートアルゴリズムを見比べてもらえばわかるかと思いますが、隣同士でない値を比較してソートすることも普通に行われます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/11 22:41

    端的に言えば「ブラウザによって実装が違うので、呼ばれ方に依存するコードは動かない」ということです。

    キャンセル

  • 2019/07/11 23:26

    そうだったのですね!
    調べ方が甘すぎました・・・。ありがとうございます。

    キャンセル

+1

既に回答がある通りブラウザによって実装が異なるうえ、いつ変わるかわからないものですが、
例示されている比較順になるのは挿入ソートだと思います。

1回目:[10, 4, 8, 1] ←array[1]の4を何処かに挿入する
10より小さいので10の前に挿入する ←4, 10

2回目:[4, 10, 8, 1] ←array[2]の8を何処かに挿入する
10より小さいので10より前、 ←8, 10
4より大きいので4の後ろに挿入する ←8, 4

3回目:[4, 8, 10, 1] ←array[3]の1を何処かに挿入する
8(array[Math.ceil(3/2)]?多分真ん中から開始するようになっている)より小さいので8より前、 ←1, 8
4より小さいので4の前に挿入する ←1, 4

chromeは今のところ、要素数が少なければ挿入ソート、要素数が多かったらクイックソートなんだとか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

やっているのこうです

const testNumber = [10,4,8,4,1];
testNumber.sort((x,y)=>{
  var ret=null;
  if(x==y){
    ret=0;
  }else if(x>y){
    ret=1;
  }else{
    ret=-1;
  }
  console.log([x,y,ret]);
  return ret;
});
console.log(testNumber);


配列から値を2つ取り出して、比較して同じなら0、前者が後者より大きければ正の値
小さければ負の値を返すと、それに応じて値がソートされます
数値の比較の場合前後の数値の差を取れば正・負・ゼロが計算できるので結果これで十分

const testNumber = [10,4,8,4,1];
testNumber.sort((x,y)=>x-y);
console.log(testNumber);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/11 23:38

    負の値が返ってきたら「第一引数を第二引数より前に」、正が返ってきたら「第一引数を第二引数のあとに」という部分は決まっていて、正の値になるか負の値になるかの条件を変えてあげると昇順・降順に切り替えられるって感じですかね・・・(説明下手で申し訳ございません...)
    回答ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.40%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • JavaScript

    21456questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。