左循环旋转一个串的5种方法

来源:互联网 发布:excel标识重复数据 编辑:程序博客网 时间:2024/06/10 00:31
 

/*功能:将一个整型数组左循环旋转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;
}