秒懂倒位序算法


  • 倒位序的实现:倒位序则是把原数的二进制表示倒过来写就成了原数的倒位数。
    倒位序的二进制实现
    N = 8
    倒位序 ----------------顺序
    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(N/2的二进制总是最高位为1,其余位为0,如当N=8二进制表示为111,N/2=4表示为100)进行比较即可得到结果。如果k>J,说明最高位为0,应把其变成1,即J+N/2,这样就得到倒序数了。如果J<=k,即J的最高位为1,将最高位化为0,即J-N/2,再判断次高位;与k=N/4进行比较,若为0,将其变位1,即J+N/4,即得到倒序数,如果次高位为1,将其化为0,再判断下一位,以此类推。

代码实现
int i,j,k;
int temp;
for(j=0,i=0;i
{
if(i
{
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改为
}

你可能感兴趣的:(秒懂倒位序算法)