本實例實現將數組元素整體向右循環移動 m 位,後 m 位移到前面。
move 函數:每次右移一位,保存最後一個元素 last,從後向前依次賦值 *p = *(p-1),最後 *array = last。重複 offset 次。print_arr 打印數組。// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鳥教程. All rights reserved.
//
#include <stdio.h>
#include <stdlib.h>
int main() {
int arr[20];
int i, n, offset;
printf("Total numbers?\n");
scanf("%d", &n);
printf("Input %d numbers.\n", n);
for (i = 0; i < n; i++) scanf("%d", &arr[i]);
printf("Set your offset.\n");
scanf("%d", &offset);
printf("Offset is %d.\n", offset);
print_arr(arr, n);
move(arr, n, offset);
print_arr(arr, n);
}
void print_arr(int array[], int n) {
int i;
for (i = 0; i < n; ++i) printf("%4d", array[i]);
printf("\n");
}
void move(int array[], int n, int offset) {
int *p, *arr_end;
arr_end = array + n;
int last;
while (offset) {
last = *(arr_end - 1);
for (p = arr_end - 1; p != array; --p)
*p = *(p - 1);
*array = last;
--offset;
}
}
時間複雜度 O(n*m)。可用「三次反轉法」達到 O(n):反轉整個數組、反轉前 m 個、反轉後 n-m 個。