1. 程式人生 > >算法習題---線性表之數組實現循環移動

算法習題---線性表之數組實現循環移動

oid 復雜 http pan 復雜度 ack temp img 空間

一:問題

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

二:思考

要實現R中序列循環左移P個位置,只需先將R中前P個元素逆置,再將剩下的元素逆置,最後將R中所有的元素再整體做一次逆置操作即可,本題算法描述如下:

技術分享圖片

(一)步驟一:將前P個元素逆置

技術分享圖片

(二)步驟二:將後P個元素逆置

技術分享圖片

(三)步驟三:將所有元素逆置(實現)

技術分享圖片

三:代碼實現

void Reverse(int R[], int l, int r)
{
    int i, j;
    int temp;
    for (i = l, j = r; i < j; i++,j--)
    {
        temp = R[i];
        R[i] = R[j];
        R[j] = temp;
    }
}

void MoveL(int R[], int n, int p)
{
    if (p <= 0 || p >= n)
        return;
    Reverse(R, 
0, p - 1); Reverse(R, p, n - 1); Reverse(R, 0, n - 1); }
int main()
{
    int a[7] = { 1, 2, 3, 4, 5, 6, 7 };
    MoveL(a, 7, 3);
    for (int i = 0; i < 7; i++)
        printf("%d", a[i]);
    system("pause");
    return 0;
}

技術分享圖片

四:性能分析

時間復雜度是O(n),空間復雜度為O(1)

五:補充---右移

void
MoveR(int R[], int n, int p) { if (p <= 0 || p >= n) return; Reverse(R, 0, n - 1); Reverse(R, 0, p - 1); Reverse(R, p, n - 1); }

技術分享圖片

六:總結左移和右移

(一)左移:將R中前p個元素逆置,剩下逆置,整體逆置

(二)右移:整體逆置,前p逆置,後p逆置

算法習題---線性表之數組實現循環移動