首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言實例練習

C語言練習實例68:數組循環右移m位

     編輯:C 語言實例練習

C語言練習實例68:數組循環右移m位

本實例實現將數組元素整體向右循環移動 m 位,後 m 位移到前面。

程序分析

  • 輸入數組大小 n、元素、偏移量 offset。
  • 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 個。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved