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

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

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

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

Q&A

2回答

1242閲覧

algorithm quicksort 渡す配列の汎用化

may88seiji

総合スコア79

JavaScript

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

0グッド

0クリップ

投稿2016/12/05 07:00

編集2016/12/08 05:54

###前提
JavaScriptでクイックソートのコードを書きました。

###実現したいこと
現在のコードでは配列aだけに対応したfunctionになっています。
この関数を配列bなど他の配列に対応するためにはどのようにしたらよいでしょうか。
(汎用的にソートする配列を関数に渡すためにはどうしたらよいでしょうか)

###該当のソースコード

javascript

1function quickSort(startID,endID){ 2 var pivot = a[Math.floor((startID + endID)/2)]; 3 var left = startID; 4 var right = endID; 5 6 while(true){ 7 while(a[left]<pivot){ 8 left++; 9 } 10 while(pivot<a[right]){ 11 right--; 12 } 13 if(right <= left){ 14 break; 15 } 16 var tmp =a[left]; 17 a[left] =a[right]; 18 a[right] =tmp; 19 left++; 20 right--; 21 } 22 if(startID < left-1){ 23 quickSort(startID,left-1); 24 } 25 if(right+1 < endID){ 26 quickSort(right+1,endID); 27 } 28} 29 var a = [3,7,2,4,6,1,9,8,5]; 30 quickSort(0,a.length-1); 31 console.log(a);

追々記
再帰のところで止まってしまうようです。。。
間違っているところを指摘いただければ幸いです。

javascript

1function startQuickSort(a, startID, endID){ 2 function quickSort(startID, endID){ 3 var pivot = a[Math.floor((startID + endID)/2)]; 4 var left = startID; 5 var right = endID; 6 7 while(true){ 8 while(a[left]<pivot){ 9 left++; 10 } 11 while(pivot<a[right]){ 12 right--; 13 } 14 if(right <= left){ 15 break; 16 } 17 var tmp =a[left]; 18 a[left] =a[right]; 19 a[right] =tmp; 20 left++; 21 right--; 22 } 23 if(startID < left-1){ 24 quickSort(startID,left-1); 25 } 26 if(right+1 < endID){ 27 quickSort(right+1,endID); 28 } 29 } 30 31 quickSort(a, startID, endID); 32 33} 34 35var a = [3,7,2,4,6,1,9,8,5]; 36startQuickSort(a, 0, a.length-1); 37console.log(a);

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

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

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

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

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

guest

回答2

0

JavaScriptの場合、オブジェクトは参照の値渡しとなりますので、取る方法は2つあります。

  • 引数で配列を受け取って、その配列を関数の中で書き換える(戻った側で同じ配列を参照しているのでそのまま使えます)
  • 引数で配列を受け取って、関数の中で作った別な配列を返り値にする

投稿2016/12/05 07:21

maisumakun

総合スコア145183

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

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

may88seiji

2016/12/05 08:22

「引数で配列を受け取って、関数の中で作った別な配列を返り値にする」 をやろうと思ったのですが、うまくいっておりません。 よければコードを教えていただけないでしょうか?
maisumakun

2016/12/05 09:02

「 var newArray = a;」としているため、newArrayもaも同じ配列を操作していることになります。
guest

0

引数に配列を含めばいいんじゃないですか?

投稿2016/12/05 07:07

shi_ue

総合スコア4437

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問