编程珠玑--旋转算法

本文探讨了三种数组旋转算法:块交换法、杂技算法和求逆算法,并提供了详细的分析及代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

旋转算法出自《编程珠玑》第二章题目。

 

《编程珠玑》一书对算法是极度推崇,这点意识在我们看书的时候每每都有被灌输。使用一种好的算法往往能使得程序更加漂亮,也很能带给我们程序员某种满足感。

 

题目:将一个n元一维数组a[n]左移i个位置。例如,当n=8,i=3时,数组abcdefgh旋转为defghabc。请设计一个算法完成这个任务。

 

1. 块交换法

分析:将n元一维数组a[n]分解为两块,将第一块存储在临时数组中,将第二块前移i个单位,再将临时数组加入到第二块后面。

 

如:n=8,i=3时,将第一块abc存储为临时变量,第二块defgh前移3个单位,再将abc放入到defgh后面。

 

思考:这种方法最大的缺陷至少需要与两块中较小的一块大小的临时变量。

 

2.杂技算法

分析:将a[0]存储在一个临时变量中,然后将a[i]替换a[0],a[2i]替换a[i]….当一个循环结束的时候,若替换次数小于n,则从a[1]开始替换…,需要经过gcd(n,i)(n和i的最大公约数)次循环后,才能把每一个元素都移到该移的地方。

求逆算法

 

下面是代码实现:

 

 

代码

 

 

 

 

3. 求逆算法

分析:将a[n]看做是向量BC组成,最终的结果需要时CB,过程如下:将BC各分别取逆B^-1C^-1,再对整个式子取逆,得到CB。

 

举例:将abcdefgh中的abc看做向量B,defgh看做向量C。

 

下面是代码实现:

 

代码

 

 

思考题:写一个算法实现字符串反转,将abc.sina.com反转为com.sina.abc。

 

分析:使用求逆算法,将abc,sina,com作为子串进行反转,再将整个字符串进行反转



本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/archive/2010/11/16/1878146.html,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值