O(1)空間子陣列換位演算法
阿新 • • 發佈:2019-01-01
#include "iostream"
#include "algorithm"
using namespace std;
//向前迴圈換位法
//將陣列a[0,k-1]與a[k,n-1]換位
void forward(int a[], int n, int k)
{
for(int i=0; i<k; i++)
{
int temp = a[0];
for(int j=1; j<n; j++)
a[j-1] = a[j];
a[n-1] = temp;
}
}
//向後迴圈換位法
//將陣列a[0,k-1]與a[k,n-1]換位
void backward(int a[], int n, int k)
{
for(int i=k; i<n; i++)
{
int temp = a[n-1];
for(int j=n-1; j>0; j--)
a[j] = a[j-1];
a[0] = temp;
}
}
//三次反轉演算法
void exch(int a[], int n, int k)
{
reverse(a, a+k); //將a[0,k-1]逆序 [4,3,2,1,5,6,7,8,9]
reverse(a+k, a+n); //將a[k,n-1]逆序[4,3,2,1,9,8,7,6,5]
reverse(a, a+n); //將a[0,n-1]逆序[5,6,7,8,9,1,2,3,4]
}
void print(int a[], int n)
{
for(int i=0; i<n; i++)
cout << a[i] << " ";
cout << endl;
}
void init(int a[])
{
for(int i=1; i<10; i++)
a[i-1] = i;
}
int main()
{
int a[9];
int n = 9;
int k = 4;
init(a);
forward(a, n, k);
cout << "forward:\t";
print(a, n);
init(a);
backward(a, n, k);
cout << "backward:\t";
print(a, n);
init(a);
exch(a, n, k);
cout << "exch:\t\t";
print(a, n);
return 0;
}