配列内のデータをソートする(マージソート)


動作ブラウザ 【 IE:3.0  NN:3.0
Internet Explorer Netscape Navigator DreamPassport iCab
3.0x 4.0x 4.5 5.0x 5.5 2.0x 3.0x 4.0x 4.x 6.0 2 3 2.x
Windows - × - -
Macintosh - × - -
UNIX - - - - - × - - -
Dreamcast - - - - - - - - - - -

ポイント function sortData(start,end) { if(start >= end) return; var mid = Math.floor((start + end) / 2); sortData(start,mid); sortData(mid+1,end); var p = 0; for (i=start; i<=mid; i++) buff[p++] = data[i]; var i = mid + 1; var j = 0; var k = start; while ((i<=end) && (j<p)) { if (buff[j] <= data[i]) { data[k++] = buff[j++]; }else{ data[k++] = data[i++]; } } while (j < p) data[k++] = buff[j++]; }
説  明 ソート方法の1つにマージソートがあります。一度データを分解し、その後連結(マージ)していくことでソートを行います。JavaScriptで処理する場合は再帰が絡むのでローカル変数は必ずvarで宣言しないと再帰エラーが発生します。
サンプル <html> <head> <title>配列内のデータをソートする(マージソート)</title> <script language="JavaScript"><!-- data = new Array(30,10,5,99,44,65,10,31,1,57,88,78); buff = new Array(); function sortData(start,end) { if (start >= end) return; var mid = Math.floor((start + end) / 2); sortData(start,mid); sortData(mid+1,end); var p = 0; for (i=start; i<=mid; i++) buff[p++] = data[i]; var i = mid + 1; var j = 0; var k = start; while ((i<=end) && (j<p)) { if (buff[j] <= data[i]) { data[k++] = buff[j++]; }else{ data[k++] = data[i++]; } } while (j < p) data[k++] = buff[j++]; } function printArray() { for (i=0; i<data.length; i++) document.write(data[i],", "); document.write("<br>"); } // --></script> </head> <body> 配列内のデータをソートする(マージソート)<br><br> ソート前:<br> <script langauge="JavaScript"><!-- printArray(); // --></script> <br> ソート後:(昇順)<br> <script langauge="JavaScript"><!-- sortData(0,data.length-1); printArray(); // --></script> </body> </html>
補足説明 参考:C言語による最新アルゴリズム辞典 奥村晴彦著。ISBN4-87408-414-1

■サンプルスクリプトを実行する >>実行
■各ブラウザでの動作結果を見る >>View!

写真素材 PIXTA