问题:有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,见下图,写一函数实现以上功能,在主函数中输入n个整数和输出调整后的n个数。
假设现有一个数组arr[] = {1,2,3,4,5},n = 5,m = 2,最终结果为3 4 5 1 2.
思路:
1.整体逆序 5 4 3 2 1
调用Swap交换函数 1 5 交换;2 4交换;3不动
2.区间逆转
在5 4 3 区间内 0 ~ n-m-1
在1 2 区间内 n-m ~ n-1
具体代码如下:
#include<stdio.h>
void Swap(int* p,int* q)
{
int temp = *p;
*p = *q;
*q = temp;
}
void Reverse(int* arr, int begin_index, int end_index) {
int* p = arr + begin_index;
int* q = arr + end_index;
while (p < q)
{
Swap(p, q);
p++;
q--;
}
}
void Adjust(int* arr, int len,int m)
{
Reverse(arr,0,len-1); //全部逆转
//区间逆转
Reverse(arr,0,len-m-1);
Reverse(arr, len - m, len - 1);
}
int main()
{
int arr[] = {1,2,13,14};
Adjust(arr,4,2);
for (int i = 0; i < 4; i++)
{
printf("%5d",arr[i]);
}
}
结果展示:
3 4 5 1 2