方法一:
每次右移一个数,数组中的所有元素都要移动
方法二:
整体导入
方法三:
三步旋转法
#include#include #include void Mov_Arr(int *arr, int size) //右移一位 { assert(arr != NULL); int tmp = arr[size - 1]; for (int i = size-1; i > 0; i--) { arr[i] = arr[i-1]; } arr[0] = tmp; } //一般做法 void Mov_Arr_N(int *arr, int size, int k) { assert(arr != NULL); if (k < 0) { printf("移动不合法!!"); return; } k = k%size; for (int i = 0; i < k; i++) { Mov_Arr(arr, size); } } //空间换时间 构造辅助空间 Mov_Arr_Space_Time(int *arr, int size, int k) { assert(arr != NULL); if (k < 0) { printf("移动不合法!!"); return; } k = k%size; int *p = (int*)malloc(sizeof(int)*size); if (p == NULL) { return; } int *tmp = arr + size - k; for (int i = 0; i < k; i++) { p[i] = tmp[i]; } for (int i = 0; i < size - k; i++) { p[i+k] = arr[i]; } for (int i = 0; i < size; i++) { arr[i] = p[i]; } free(p); p = NULL; } void Swap(int*a, int*b) { int tmp = *a; *a = *b; *b = tmp; } //逆置三次法 规律总结 void Inver(int *arr, int left, int right) { assert(arr != NULL); while (left < right) { Swap(&arr[left++], &arr[right--]); } } void Inver_arr(int *arr, int size, int k) { assert(arr != NULL); k = k%size; Inver(arr, 0, size - 1); Inver(arr, 0, k - 1); Inver(arr, k, size - 1); } void Print(int*arr, int size) { assert(arr != NULL); for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } } int main() { int arr[10] = { 12, 23, 34, 45, 56, 67, 78, 89, 90, 100 }; int count = sizeof(arr) / sizeof(arr[0]); Print(arr, count); printf("nn"); Mov_Arr_N(arr, count, 3); Print(arr, count); printf("nn"); Mov_Arr_Space_Time(arr, count, 5); Print(arr, count); printf("nn"); Inver_arr(arr, count, 5); Print(arr, count); system("pause"); return 0; }



