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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

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

Q&A

3回答

153閲覧

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

hati_32

総合スコア12

JavaScript

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

0グッド

1クリップ

投稿2019/07/11 11:58

前提・実現したいこと

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

試したこと

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

該当のソースコード

javascript

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yasutomi

2019/07/11 12:09

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

2019/07/11 12:14

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

回答3

0

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

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は今のところ、要素数が少なければ挿入ソート、要素数が多かったらクイックソートなんだとか。

投稿2019/07/12 02:33

moredeep

総合スコア1507

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

比較されている値の順序がよく分かりません・・・。

4と10が比較された後、8と10が比較されるのは分かるのですが、8と10...1と4となるのは何故なのでしょうか。

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

投稿2019/07/11 13:41

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/07/11 13:41

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

2019/07/11 14:26

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

0

やっているのこうです

javascript

1const testNumber = [10,4,8,4,1]; 2testNumber.sort((x,y)=>{ 3 var ret=null; 4 if(x==y){ 5 ret=0; 6 }else if(x>y){ 7 ret=1; 8 }else{ 9 ret=-1; 10 } 11 console.log([x,y,ret]); 12 return ret; 13}); 14console.log(testNumber);

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

javascript

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

投稿2019/07/11 13:42

yambejp

総合スコア114829

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hati_32

2019/07/11 14:38

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問