/*功能:将一个整型数组左循环旋转i个位置*/
#include<stdio.h>
#include<stdlib.h>
#define WAYS_FIR 1
#define WAYS_SEC 2
#define WAYS_THI 3
#define WAYS_FOU 4
#define WAYS_FIF 5
static void swap(int *a,int *b){
int tmp=*a;
*a=*b;
*b=tmp;
}
/*翻转一个整数数组中整数的排列顺序*/
static void reverse(int *array,int n)
{
int i;
for(i=0;i<n/2;i++){
swap(&array[i],&array[n-1-i]);
}
}
/*i个辅助空间*/
static void left_rotate1(int *array,int n,int i)
{
int *tmp_arr=(int *)malloc(sizeof(int)*i);
int j;
for(j=0;j<i;j++){
tmp_arr[j]=array[j];
}
for(;j<n;j++){
array[j-i]=array[j];
}
for(j=0;j<i;j++){
array[n-i+j]=tmp_arr[j];
}
free(tmp_arr);
}
/*一个辅助变量*/
static void left_rotate2(int *array,int n,int i)
{
int j;
for(j=0;j<i;j++){
int k;
int key=array[0];
for(k=1;k<n;k++){
array[k-1]=array[k];
}
array[n-1]=key;
}
}
/*拉链法*/
static void left_rotate3(int *array,int n,int i)
{
int count=0;
int j;
for(j=0;j<i && count<n;j++){
int k;
for(k=j;(k+i)%n!=j;k+=i){
swap(&array[k%n],&array[(k+i)%n]);
count++;
}
count++;
}
}
/* 递归求解*/
static void left_rotate4(int *array,int n,int i)
{
if(n<=i || i==0) return;
int min=(n-i)>i?i:(n-i);
int j;
for(j=0;j<min;j++){
swap(&array[j],&array[n-min+j]);
}
if(min==i) left_rotate4(array,n-i,i);
else left_rotate4(array+n-i,i,2*i-n);
}
/*翻手法*/
static void left_rotate5(int *array,int n,int i)
{
reverse(array,i);
reverse(array+i,n-i);
reverse(array,n);
}
static void left_rotate(int *array,int n,int i,int choice)
{
switch(choice)
{
case WAYS_FIR:
left_rotate1(array,n,i);
break;
case WAYS_SEC:
left_rotate2(array,n,i);
break;
case WAYS_THI:
left_rotate3(array,n,i);
break;
case WAYS_FOU:
left_rotate4(array,n,i);
break;
case WAYS_FIF:
left_rotate5(array,n,i);
break;
default:
printf("error switch!\n");
exit(EXIT_FAILURE);
}
}
int main(int argc,char *argv[])
{
int array[23]={0,1,2,3,4,5,6,7,8,9,10,11,
12,13,14,15,16,17,18,19,20,21,22};
left_rotate(array,23,7,WAYS_FOU);
int i;
for(i=0;i<23;i++){
printf("%d ",array[i]);
}
printf("\n");
return 0;
}