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

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

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

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

意見交換

6回答

385閲覧

javascriptの配列 バケツソートについて質問

maitake_ninn

総合スコア1

JavaScript

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

0グッド

2クリップ

投稿2025/02/05 07:19

編集2025/02/05 08:09

★下記は配列の練習問題の回答です。
バケツソートのアルゴリズムを再現してみよう という趣旨のものでした。

const nums = [78, 16, 32, 4, 91, 45, 23, 66, 57, 89];
const buckets = []; // バケツとなる配列
const sorted = []; // 昇順でデータを入れる配列
for (let num of nums) {
// バケツに追加する処理
buckets[num] = num;
}
for (let i = 0; i < 100; i++) {
// バケツから順番に取り出す処理
if (buckets[i]) {
sorted.push(buckets[i]);
}
}
console.log(sorted);

これは何故一度 bucket に numを移行しているのですか?

const nums = [78, 16, 32, 4, 91, 45, 23, 66, 57, 89];
const sorted = [];
for (let i = 0; i < 100; i++) {
// バケツから順番に取り出す処理
if (nums[i]) {
sorted.push(nums[i])
}
}
console.log(sorted);
// [4, 16, 23, 32, 45, 57, 66, 78, 89, 91] と出力

じゃダメなのは何故ですか?
numsの中の数字が i と一致したときに sortedに数字を入れる。だけですよね。何故一度bucketsにいれなくてはならないのかが分からないです。
sorted.push(nums[i])だとnumsの中の数字ではなくてインデックスをとることになるからということでしょうか。
だとすれば、buckets[i]だとインデックスにならないのは何故ですか。
もしかしてbucketsにいれるときに for of文を使用しているのはそこでインデックスではなく数値を取得しているためで、そのためにbucketsを使用しているということなのでしょうか。

もし上記であっているとしても、使い分けが難しいと感じます。自分で一から考えたいなーって思ったら、まず主要なアルゴリズムを学び、そのアルゴリズムを実装するにはどうしたら良いかを学ぶのが一番はやいのでしょうか。慣れたらどこでどのアルゴリズムを使用するか感覚でわかるようになりますか。

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

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

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

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

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

回答6

#1

Lhankor_Mhy

総合スコア37207

投稿2025/02/05 07:30

当方の環境では、後者のコードはソートされませんでした。

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

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

#2

yambejp

総合スコア117203

投稿2025/02/05 07:36

質問はなにが目的なのでしょうか?
単にソートされた結果だけ得たいのであればjsの場合ソートは配列のメソッドで提供されています。
ソートのアルゴリズムをプログラムで再現したいのですか?
もしそうだとしてソートの方式(マージ、ヒープ、バブル)は何を想定しているでしょうか?

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

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

#3

juner

総合スコア627

投稿2025/02/05 07:56

できればコードはインデントが生きる様に ``` で囲ってほしいところですが、そもそも前者はちゃんと動いているけれど、後者は動いていないのではないでしょうか……?

バケットソートは 値順のバケツに値を集める ソートなので その それぞれのバケツとして 配列の要素を利用しているものと思われます。buckets[num] = num により 値を index とした位置に設定し、 あとは順番に 存在チェックして存在したものを sorted に格納すればその値順になる感じだと思われます。

バケットソート - Wikipedia

まぁ、前提条件として このコードでは 0が無いこと と 同じ値が存在しないことがあるのがもにょるはありますが。

参考まで コメントを書くならこんな感じでしょうか?

js

1const nums = [78, 16, 32, 4, 91, 45, 23, 66, 57, 89]; 2const buckets = []; // バケツとなる配列 3const sorted = []; // 昇順でデータを入れる配列 4 5// buckets の num 位置に num を入れることで昇順に挿入する 処理 6for (let num of nums) { 7 buckets[num] = num; 8} 9 10// 空を除去して sorted に設定する処理 11for (let i = 0; i < 100; i++) { 12 // buckets の i 位置に値が設定されているかをチェック 13 if (buckets[i]) { 14 // 設定されているのであれば そこの値を sorted に設定する 15 sorted.push(buckets[i]); 16 } 17} 18console.log(sorted);

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

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

#4

maisumakun

総合スコア146329

投稿2025/02/05 08:06

ここでソートされるのは、bucket値ごとの位置に値を詰め込んで、それを数字順に回すからソートされる、という流れです。


numsの中の数字が i と一致したときに sortedに数字を入れる。だけですよね。

そうではありません。単にpushするだけでは、順番は変わりません。

sorted.push(nums[i])だとnumsの中の数字ではなくてインデックスをとることになるからということでしょうか。

違います。値がそのままの順番でpushされるだけになるので、ソートにはなりません。

もしかしてbucketsにいれるときに for of文を使用しているのはそこでインデックスではなく数値を取得しているためで、そのためにbucketsを使用しているということなのでしょうか。

特にfor-ofである必要はありません。普通のfor.forEachで回しても同じことは可能です。

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

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

#5

TakaiY

総合スコア14039

投稿2025/02/05 08:15

numsの中の数字が i と一致したときに sortedに数字を入れる。だけですよね。

はい。そのとおりです。

ですが、このコードはそれを表わしていません。

javascript

1if (nums[i]) { 2sorted.push(nums[i]) 3}

nums[i]はののものは 配列numsのi番目の要素ですが、それが**「何」**ですか?

何故一度bucketsにいれなくてはならないのか

それは、その数値を、その値と同じインデックスに入れるためです。
配列 numsには以下のように値が入っています。

インデックス0123
7816324

これは、左から取り出してもソートされていません。
しかし、 この数値を順に取り出して、以下のように配列bucketに入れると

javascript

1for (let num of nums) { 2// バケツに追加する処理 3buckets[num] = num; 4}

値は その値と同じ(buckets[num] = num)インデックスに入るので、このような配列になります。

インデックス0...4...16...32...78...
-...4...16...32...78...

値を入れなかったところの値はありません。

最後にこの配列を、順に取り出すと、ソートされた結果になるということです。

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

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

#6

utm.

総合スコア524

投稿2025/02/05 09:37

これは何故一度 bucket に numを移行しているのですか?

そのコードを書いた人がプログラミングをよく知らないのでしょう。
よくあります。

このソートは一見すると重複した値がある場合、不具合を起こします。
もしこれが検索アルゴリズムなら優秀だったかもしれません。残念ながら自作しなくてもSetがありますが。

もしかしたら頭がハッシュセットに取り憑かれた状態でコーディングしたのかもしれません。

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

この意見交換はまだ受付中です。

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

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

関連した質問