编程示例:求排列的逆,反序表,以及从反序表计算排列

编程示例:求排列的逆,反序表,以及从反序表计算排列

计算机程序设计艺术的第三卷 第五章排序中,第5.1.1节中
提到了排列的反序,反序表,逆的概念。

首先,简单地介绍一下这两个概念。例如一个排列 3 1 4 2 
从小到大的角度来看,有三个反序:分别是(3,1),
(3,2)和(4,2)
例如 排列 5 9 1 8 2 6 4 7 3 它的反序表是 2 3 6 4 0 2 2 1 0
反序表中第1个字是2,表示在原始的排列中涉及到1的反序有2个。
反序表中第2个字是3,表示在原始的排列中涉及到2的反序有3个。
在原始的排列中,1的左边有两个比1大的数字。
在原始的排列中,2的左边有三个比2大的数字。

排列的逆的定义是 a[k]=j 则a[j]=k。就是一个排列 用它的值进行
重新排序。当然了,排序时要带着它的下标。然后由它的下标组成了
一个新的排列。这个新的排列就是原始的排列的逆。

5 9 1 8 2 6 4 7 3   = 1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9   = 3 5 9 7 1 6 8 4 2 

所以 排列 5 9 1 8 2 6 4 7 3 的逆是3 5 9 7 1 6 8 4 2 

javascript 代码如下:
<html>
<title>排列的反序表</title>
<body>
<button id="button" οnclick="play()">生成反序表</button>

<p>输入排列:</p>
<textarea id='txt' rows="3" cols="130"></textarea>
<p><button id="button" οnclick="generate()">生成排列</button></p>
<p>输入排列的反序表:</p>
<textarea id='txt2' rows="3" cols="130"></textarea>
<p>输出结果排列:</p>
<textarea id='result' rows="3" cols="130"></textarea>
<script>
 var arr=[0,5,9,1,8,2,6,4,7,3];
 var reverse_order_table=[0,2,3,6,4,0,2,2,1,0];
 
function play(){
var arr_str=document.getElementById("txt").value;
var arr=arr_str.split(',');
var reverse_arr=get_reverse(arr);
var table=get_opposite(arr,reverse_arr);
document.getElementById("result").innerText=table;
}

function generate()
{
var arr_str=document.getElementById("txt2").value;
var arr=arr_str.split(',');   
var link_table = get_permulation(arr); 
document.getElementById("result").innerText= traversal_link_table(link_table);
}
/* 得到排列的逆  */
function get_reverse(arr)
{
   var result=[0];
   for(var i=1;i<arr.length;i++)
    {
      for(var j=1;j<arr.length;j++)
      {
         if(arr[j]==i) 
         {
            result.push(j);
         }
      }
    }
    return result;
}
/* 得到排列的反序表  */
function get_opposite(arr,reverse_arr)
{
    var result=[0];
   for(var i=1;i<reverse_arr.length;i++)
    {
      var times=0;
      for(var j=1;j<reverse_arr[i];j++)
      {
         if(arr[j]>i) 
         {  
            times++;  
         }
      }
      result.push(times);
    }
    return result;
}
/* 根据反序表,得到排列的链表结构  */
function get_permulation(table)
{
var link_table=[[0,0]];

   for(var i=table.length-1;i>0;i--)
   {
      var j=0;
      var next=0;
      while(j<=table[i])
      {
         if(j<table[i])
         {
         next=link_table[next][1];
         }
         else 
         { var point=link_table[next][1];
            link_table.push([i,point]);
            link_table[next][1]=link_table.length-1;
         }
         j++;
      }
   }
   
   return link_table;
}
/* 根据排列的链表结构,得到排列  */
function traversal_link_table(table)
{
   var result =[0];
   var next=0;
   while(table[next][1]>0)
      {   
          next=table[next][1];
          result.push(table[next][0]);
      }
    return result;  
}
</script>
</body>
</html>

代码的html界面如下:测试案例中的第1 个0 ,是占位符。

猜你喜欢

转载自blog.csdn.net/gggwfn1982/article/details/130958988