/*
问题描述:数组序列变换,将数组中元素以新的次序重新排列得到新的数组,例如A={1,2,3,4,5,6},变换序列P={3,1,5,4,0,2},
将变换应用到数组A中得到新的数组B={A[3],A[1],A[5],A[4],A[0],A[2]},要求在不申请新的数组空间,在A数组上直接进行处理完成
来源:网易算法课
问题描述:数组序列变换,将数组中元素以新的次序重新排列得到新的数组,例如A={1,2,3,4,5,6},变换序列P={3,1,5,4,0,2},
将变换应用到数组A中得到新的数组B={A[3],A[1],A[5],A[4],A[0],A[2]},要求在不申请新的数组空间,在A数组上直接进行处理完成
来源:网易算法课
*/
#include <iostream>
#include <vector>
using namespace std;
int moveStep(vector<int> P, int end)
{
int i, count = 0, step = 0;
for (i = 0; i < end; i++)
{
if (P[end] < P[i])
count++;
}
return step + count;
}
void moveArray(vector<int> &A, int begin, int end)
{
for (;end > begin; end--)
{
A[end] = A[end - 1];
}
}
void arraySequenceTransform(vector<int> &A, const vector<int> P)
{
int i, change, temp;
for (i = 0; i < P.size(); i++)
{
change = P[i] + moveStep(P, i);
temp = A[change];
//数组i到change-1右移一位
moveArray(A, i, change);
A[i] = temp;
}
}
int main()
{
vector<int> A = { 1, 2, 3, 4, 5, 6 };
vector<int> P = { 3, 1, 5, 4, 0, 2 };
arraySequenceTransform(A, P);
for (int i = 0; i < A.size(); i++)
cout << A[i] << " ";
return 0;
}