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

540人阅读 评论(0)

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;
}

0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：402887次
• 积分：6379
• 等级：
• 排名：第3819名
• 原创：235篇
• 转载：4篇
• 译文：9篇
• 评论：2条
阅读排行
评论排行
最新评论