配列内のデータをソートする(ヒープソート)


動作ブラウザ 【 IE:3.0  NN:2.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 - - - - - - - - - - -

ポイント N = data.length-1; for (k=N; k>0; k--) { i = k; n = data[i]; while ((j = i*2) <= N) { if ((j<N) && (data[j] < data[j+1])) j++; if ( n >= data[j]) break; data[i] = data[j]; i = j; } data[i] = n; } while (N > 1) { n = data[N]; data[N] = data[1]; N--; i = 1; while ((j = i*2) <= N) { if ((j < N) && (data[j] < data[j+1])) j++; if (n >= data[j]) break; data[i] = data[j]; i = j; } data[i] = n; }
説  明 ソート方法の1つにヒープソートがあります。ヒープ(二分木)を作成し再構成していくことでソートを行います。
サンプル <html> <head> <title>配列内のデータをソートする(ヒープソート)</title> <script language="JavaScript"><!-- data = new Array(30,10,5,99,44,65,13,31,1,57,88,78); function sortData() { data[data.length] = data[0]; N = data.length-1; for (k=N; k>0; k--) { i = k; n = data[i]; while ((j = i*2) <= N) { if ((j<N) && (data[j] < data[j+1])) j++; if ( n >= data[j]) break; data[i] = data[j]; i = j; } data[i] = n; } while (N > 1) { n = data[N]; data[N] = data[1]; N--; i = 1; while ((j = i*2) <= N) { if ((j < N) && (data[j] < data[j+1])) j++; if (n >= data[j]) break; data[i] = data[j]; i = j; } data[i] = n; } for (i=0; i<data.length-1; i++) data[i] = data[i+1]; data.length--; } 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(); printArray(); // --></script> </body> </html>
補足説明 参考:C言語による最新アルゴリズム辞典 奥村晴彦著。ISBN4-87408-414-1

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

写真素材 PIXTA