一.算法思想
思路一:例如数组[1,2,3,4,5],想左移动3个位置,移动之后的数组变为[4,5,1,2,3]。这时,如果我们用a代表1,2,3,用b代表4,5。那么就可以看成数组[a,b]变为了数组[b,a]。那么问题就变成了:如何将[a,b]变为[b,a]呢?
答案就是:首先将a逆置,变为[a逆置,b],然后再将b逆置,变为[a逆置,b逆置],最后将整个数组逆置就变为了[b,a] (这里可能需要用到一些线性代数的知识)
思路二:借助辅助数组temp,将数组R中前P个元素放入temp中,随后将后面的元素左移,最后再将temp中的P个元素放回到R数组中
二.源代码
解1:
void Reverse(List list,int start,int end){
int temp = 0; //辅助变量
for(int i =start,int j = end; i<j; i++,j--){ //逆置
temp = list.Data[i];
list.Data[i] = list.Data[j];
list.Data[j] = temp;
}
}
//算法主函数
void Converse(List list,int start,int end){
Reverse(List list,int start,int p-1);
Reverse(List list,int p,int end);
Reverse(List list,int start,int end);
}
解2:
void Reverse_P(List list,int p){
int index;
ElementType temp[MAXSIZE]; //辅助数组
for (int i = 0; i < p; i++) //将前P个元素放入辅助数组中
temp[i] = list->Data[i];
/*后面n-p个元素往前移动*/
for (int j = p, index = 0 ; index < p&&j<=list->Last; index++,j++ ) {
list->Data[index] = list->Data[j];
}
//将放入辅助数组的前P个元素重新放回到原数组中
for (int i = 0, int j = index; j <= list->Last;i++,j++) {
list->Data[j] = temp[i];
}
}