雷德(Rader)算法

对于N个数,我们把递增自然数(0、1、2、3、……、N)称为顺序数列;对顺序数列中的每一个数,将其二进制倒序后转化为十进制,称为倒叙数列。

下面,以N=8举例,
顺序序列为:
01234567。
顺序序列的二进制序列为:
000,001,010,011,100,101,110,111
对顺序序列的二进制序列每一个元素倒叙:

000,100,010,110,001,101,011,111

对上一序列的每一个元素求十进制,即为倒位叙列:

0,4,2,6,1,5,3,7


更直观的展示:

倒位序列 -----------顺序序列          
0(000)----------- 0(000)                                      
4(100)----------- 1(001)                                      
2 (010)----------- 2(010)                                    
6 (110)----------- 3(011)                                  
1 (001)----------- 4(100)                                       
5 (101)----------- 5(101)                                        
3 (011)----------- 6(110)                                        
7 (111)------------7 (111)   


可以发现,顺序序列的二进制序列,其下一个数是上一个数最低位加1并由低位向高位进位得到,而倒位序列的二进制序列,其下一个数是上一个数在最高位加1并由高位向低位进为而得到的。
 
算法描述:在N个数中,若已知某数的倒序数是J,求下一个倒序数,应先判断J的最高位是否为0,与k=N/2进行比较即可得到结果。如果k>J,说明最高位为0,应把其变成1,即J+N/2,这样就得到倒序数了。如果k<=J,即J的最高位为1,将最高位置为0,即J-N/2,再判断次高位;与k=N/4进行比较,若为0,将其变位1,即J+N/4,即得到倒序数,如果次高位为1,将其化为0,再判断下一位......

#include <iostream>
#include <cstdio>
using namespace  std;


int x[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int y[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int N = 8;


int main()
{
    int i,j,k;
    int temp;


    for(j=0,i=0;i<N-1;i++)    //这里实现了奇偶前后分开排序
    {
        if(i<j)                        //如果i<j,即进行变址
        {
            temp = x[j];
            x[j]  = x[i];
            x[i]  = temp;
        }
        k = N/2;                 //求j的下一个倒位序
        while(j >= k)        //如果k<=j,表示j的最高位为1
        {
            j = j-k;                 //把最高位变成0
            k = k/2;               //k/2,比较次高位,依次类推,逐个比较,直到某个位为0
        }
        j = j+k;                //把0改为
    }//for()


    for(i = 0 ; i < N ; ++ i)
    {
        printf("%2d      %2d\n" , i , x[i]) ;
    }


    return 0 ;
}

                         


  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值