# 编程之美 - 数组循环移位

1 2 3 4 5 6 7   == 第一次变化 ==>  4 3 2 15 6 7   == 第二次变化 ==>  4 3 2 1 7 6 5  == 第三次变化  ==>  5 6 7 1 2 3 4

#include <iostream>

using namespace std;

void printarr(int arr[], int len)
{
int i = 0;
for (i = 0 ; i < len; i++)
{
cout << arr[i] << "  ";
}
cout << endl << endl;
}

/////////////////////////////////////////////////////
//  algorithm one
/////////////////////////////////////////////////////
void swap1(int arr[], int len, int k)
{
int i = 0, cnt=0;

cout << "Algorithm 1: "<< "shift: " << k << endl;
k %= len;

if (len%k == 0)
{
cnt = 0;
while(cnt < k)
{
for (i = cnt+k; i < len; i=i+k)
{
arr[cnt] = arr[cnt] ^ arr[i];
arr[i] = arr[i] ^ arr[cnt];
arr[cnt] = arr[cnt] ^ arr[i];
}
cnt++;
}
}
else
{
while(cnt < len-1)
{
i = i + k;
if (i < len)
{
cout << arr[0] << "<==>" << arr[i] << endl;
arr[0] = arr[0] ^ arr[i];
arr[i] = arr[i] ^ arr[0];
arr[0] = arr[0] ^ arr[i];
}
else
{
i = i%len;
cout << arr[0] << "<==>" << arr[i] << endl;
arr[0] = arr[0] ^ arr[i];
arr[i] = arr[i] ^ arr[0];
arr[0] = arr[0] ^ arr[i];
}
cnt++;
}
}
printarr(arr, len);
}

/////////////////////////////////////////////////////
//  algorithm two
/////////////////////////////////////////////////////
void reserve(int arr[], int l, int r)
{
int tmp = 0;
for(; l < r; l++, r--)
{
tmp = arr[l];
arr[l] = arr[r];
arr[r] = tmp;
}
}
void swap2(int arr[], int len, int k)
{
cout << "Algorithm 2: "<< "shift: " << k << endl;

k %= len;
reserve(arr, 0, len-k-1);
reserve(arr, len-k, len-1);
reserve(arr, 0, len-1);

printarr(arr, len);
}

int main()
{
int len = 0, k = 0;
int test[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
len = sizeof(test)/sizeof(test[0]);

int *parr = new int[len];

k = 4;
memcpy(parr, test, len*sizeof(int));
cout << "----------------------------------" << endl;
printarr(parr, len);

swap1(parr, len, k);
memcpy(parr, test, len*sizeof(int));
swap2(parr, len, k);

k = 2;
memcpy(parr, test, len*sizeof(int));
cout << "----------------------------------" << endl;
printarr(parr, len);
swap1(parr, len, k);
memcpy(parr, test, len*sizeof(int));
swap2(parr, len, k);

k = 1;
memcpy(parr, test, len*sizeof(int));
cout << "----------------------------------" << endl;
printarr(parr, len);
swap1(parr, len, k);
memcpy(parr, test, len*sizeof(int));
swap2(parr, len, k);

k = 3;
memcpy(parr, test, len*sizeof(int));
cout << "----------------------------------" << endl;
printarr(parr, len);
swap1(parr, len, k);
memcpy(parr, test, len*sizeof(int));
swap2(parr, len, k);
delete[] parr;
cin >> len;
return 0;
}

• 本文已收录于以下专栏：

举报原因： 您举报文章：编程之美 - 数组循环移位 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)