組合せ生成プログラム JavaScript (2)

 以前、JavaScriptで作った組合せ生成プログラムをちょっと書き直してみました。(^_^;
 今回のは同じものを含んでいても使えます。

●GenComb02.html

<html>
<head>
<title>GenComb02.html</title>
<script type="text/javascript">
// 順列生成
function next_perm(p, n, r)
{
  var i, j, k, tmp;
  if(r <= 0 || n < r) return(false);
  for(i = r + 1; i <= n-1; i++)
    for(j = i; j >= r + 1 && p[j-1] < p[j]; j--)
      tmp = p[j], p[j] = p[j-1], p[j-1] = tmp;
  for(i = n - 1; i > 0 && p[i-1] >= p[i]; i--);
  if(!i) return(false);
  for(j = n - 1; j > i && p[i-1] >= p[j]; j--);
  tmp = p[i-1], p[i-1] = p[j], p[j] = tmp;
  for(j = n - 1; i < j; i++, j--)
    tmp = p[i], p[i] = p[j], p[j] = tmp;
  return(true);
}
function isAscending(p, m) {
  for(var i=0; i< m-1; i++)
    if(p[i]> p[i+1]) return(false);
  return(true);
}
// 組合せ生成
function next_comb(p, n, r)
{
  do{
    if(!next_perm(p,n,r)) return(false);
  } while(!isAscending(p,r));
  return(true);
}
</script>
</head>
<body>
<script type="text/javascript">
var cnt=0
var N=5;
var R=3;
var P=["A","B","C","D","E","F","G","H","I","J"];
var p =new Array(N);
p=P.slice(0,N).sort();

var tm=(new Date()).getTime();  // Timer start
do{
  document.write(++cnt,":",p.slice(0,R),"<br>");
}while(next_comb(p,N,R));

tm=(new Date()).getTime()-tm;  // Timer stop
document.write("Runtime : ",tm/1000.0, "[sec]<br>");
</script>
</body>
</html>

●実行結果

1:A,B,C
2:A,B,D
3:A,B,E
4:A,C,D
5:A,C,E
6:A,D,E
7:B,C,D
8:B,C,E
9:B,D,E
10:C,D,E
Runtime : 0[sec]

※参考URL
同じものを含む組合せの質問をJavaで解いてみた。
組合せ生成プログラム JavaScript - rscの日記
組合せ生成プログラム JavaScript (3) - rscの日記

JavaScript 第6版

JavaScript 第6版

JavaScriptリファレンス 第6版

JavaScriptリファレンス 第6版

JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス

JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス