#include <stdio.h>
#define SIZE 100
//将一个size元一维向量vector向左旋转bits个位置
void rotateV1(char vector[], int size, int bits){
//消耗辅助空间
char stack[SIZE];
int top = 0;
int i;
for (i = 0; i < bits; i++)
stack[top++] = vector[i];
int index = 0;
for ( ; i < size; i++)
vector[index++] = vector[i];
for (i = 0; i < top; i++)
vector[index++] = stack[i];
}
void rotate1Bit(char vector[], int size){
char temp = vector[0];
int i;
for (i = 1; i < size; i++)
vector[i - 1] = vector[i];
vector[size - 1] = temp;
}
void rotateV2(char vector[], int size, int bits){
//重复调用函数,消耗时间
while (bits--)
rotate1Bit(vector, size);
}
int gcd(int a, int b){
int c = a % b;
if (c == 0)
return b;
else
return gcd(b, c);
}
void rotateV3(char vector[], int size, int bits){
int limit = gcd(size, bits);
int i;
for (i = 0; i < limit; i++){
int temp = vector[i];
int indexSelected = i + bits;
int indexReplaced = i;
//跳跃式移动
while (indexSelected != i){
vector[indexReplaced] = vector[indexSelected];
indexReplaced = indexSelected;
//下面两条语句用来优化 indexSelected = (indexSelected + bis) % size;
indexSelected += bits;
if (indexSelected >= size)
indexSelected -= size;
}
vector[indexReplaced] = temp;
}
}
void reverse(char vector[], int start, int end){
char *left = &vector[start];
char *right = &vector[end];
while (left < right){
char temp = *left;
*left = *right;
*right = temp;
left++;
right--;
}
}
void rotateV4(char vector[], int size, int bits){
//巧妙利用反转
reverse(vector, 0, bits - 1);
reverse(vector, bits, size - 1);
reverse(vector, 0, size - 1);
}
int main(){
return 0;
}
《编程珠玑》2.3 将一个n元一维向量左旋转i个位置
最新推荐文章于 2019-04-20 21:54:21 发布