欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

数组循环左移 i 位

程序员文章站 2023-09-28 16:14:30
数组左移 i 位 3 种方法 1.临时数组存储 先将前 i 个元素用数组存起来 再将后 n - i 个元素左移 i 位 最后将存起来的数组添加到后面去即可 2.通过多次调用左移 1 位的函数 3.翻转 将待移动的数组以 i 为分隔看成两段 AB 先将 A 翻转,再将 B 翻转 之后将数组整个翻转 1 ......

数组左移 i 位 3 种方法

1.临时数组存储

  先将前 i 个元素用数组存起来

  再将后 n - i 个元素左移 i 位

  最后将存起来的数组添加到后面去即可

 

2.通过多次调用左移 1 位的函数

 

3.翻转

  将待移动的数组以 i 为分隔看成两段 ab

  先将 a 翻转,再将 b 翻转

  之后将数组整个翻转

 

数组循环左移 i 位
 1 #include <stdio.h>
 2 typedef int elemtype;
 3 
 4 void move1(elemtype a[], int n, int i) {
 5     //将前 i 个元素存起来
 6     elemtype b[i];
 7     int j;
 8     for(j = 0; j < i; j++) {
 9         b[j] = a[j];
10     }
11     //将后 n - i 个元素左移 i 位
12     int k;
13     k = 0;
14     for(j = i; j < n; j++) {
15         a[k++] = a[j];
16     }
17     //将存起来的元素复制到其末尾
18     k = 0;
19     for(j = n - i; j < n; j++) {
20         a[j] = b[k++];
21     }
22 }
23 
24 void move2(elemtype a[], int n, int i) {
25     while(i != 0) {
26         int k;
27         int temp = a[0];
28         for(k = 1; k < n; k++) {
29             a[k - 1] = a[k];
30         }
31         a[n - 1] = temp;
32         i--;
33     }
34 }
35 
36 void reverse(elemtype a[], int low, int high) {
37     int temp;
38     while(low < high) {
39         temp = a[low];
40         a[low] = a[high];
41         a[high] = temp;
42         low++;
43         high--;
44     }
45 }
46 
47 void move3(elemtype a[], int n, int i) {
48     reverse(a, 0, i - 1);
49     reverse(a, i, n - 1);
50     reverse(a, 0, n - 1);
51 }
52 
53 void print(elemtype a[], int n) {
54     for(int i = 0; i < n; i++) {
55         printf("%d ", a[i]);
56     }
57     printf("\n");
58 }
59 
60 int main(int argc, char const *argv[]) {
61     elemtype a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
62     move2(a, 10, 3);
63     print(a, 10);
64     return 0;
65 }
view code