完美洗牌Perfect Shuffling Algorithm

之前遇到过一个完美洗牌问题

有个长度为2n的数组{a1,a2,a3,...,an,b1,b2,b3,...,bn},希望排序后{a1,b1,a2,b2,....,an,bn}

我也知道根据代数理论,置换环什么玩意儿的可以通过置换得到

但是这可是面试题哎,难道不是面试程序员是面试近视代数知识么。。。。

def perfectShuffle(input_list, start_index, end_index):
    length = end_index - start_index + 1
    temp = None
    if length % 2 != 0:
        raise Exception('list length must be multiple of 2')
    half_length = length / 2
    if half_length % 2 != 0:
        if half_length == 1:
            return
        else:
            for i in range(start_index+half_length - 1, start_index+length - 2):
                temp = input_list[i]
                input_list[i] = input_list[i+1]
                input_list[i+1] = temp
            half_length = half_length - 2
            perfectShuffle(input_list, start_index, end_index - 2)
    else:
        quarter_length = half_length/2
        for i in range(start_index + quarter_length, start_index+half_length):
            temp = input_list[i]
            input_list[i] = input_list[i+quarter_length]
            input_list[i+quarter_length] = temp
        perfectShuffle(input_list, start_index , start_index + half_length - 1)
        perfectShuffle(input_list, start_index + half_length, start_index + length - 1)
        

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值