數組的循環左移


描述

 

設將n(n>1)個整數存放到一維數組R中。試設計一個在時間和空間兩方面都盡可能高效的算法,將R中保存的序列循環左移p(0<p<n)個位置,即將R中的數據由(x0, x1…, xn-1)變換為(xp,xp+1,…,xn-1,x0,x1,…,xp-1)。

 

輸入

多組數據,每組數據有三行。第一行為一個整數n,代表數組R中有n個元素。第二行為數組R中的n個元素(元素之間用空格分隔)。第三行為一個整數p,代表將R中的序列循環左移p個位置。當n等於0時,輸入結束。

輸出

每組數據輸出一行,為移動后的數組R中所存放的序列。每兩個數之間用空格分隔。 輸入樣例

輸入樣例 1 

5
1 2 3 4 5
1
6
-1 2 3 2 4 3
3
0

輸出樣例 1

2 3 4 5 1
2 4 3 -1 2 3

 

 

因為要求盡量降低時空復雜度,

將數組R循環左移p位后,前p個數一定移動到后面,而后n-p移動到前面,因此可先將數組R逆置,然后再將R中前n-p個元素原地逆置,再將后p個元素原地逆置

用REVERse函數來進行實現。這樣,上述算法中三個Reverse函數的時間復雜度分別為O(n/2)、O((n-p)/2)和O(p/2),故所設計的算法的時間復雜度為O(n),空間復雜度為O(1)。最為快捷

 

 

#include<iostream>
using namespace std;

void Reverse(int r[], int begin, int end) {
    int i, temp;
    for (i = 0; i < (end - begin + 1) / 2; i++) {
        temp = r[begin + i];
        r[begin + i] = r[end - i];
        r[end - i] = temp;
    }
}

int main() {
    while (1) {
        int r[10000];
        int n,position;
        cin >> n;
        if (n == 0)
            break;
        for (int i = 0; i < n; i++)
            cin >> r[i];
        cin >> position;
        Reverse(r, 0, n - 1);
        Reverse(r, 0, n - 1 - position);
        Reverse(r, n - position, n - 1);
        for (int i = 0; i < n ; i++) {
            if (i == n - 1)
                cout << r[i] << endl;
            else
                cout << r[i] << ' ';
        }
    }
}    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM