陣列迴圈右移

2021-07-10 06:33:28 字數 860 閱讀 9547

描述:將乙個長度為 n 的陣列 a 的元素迴圈右移(ror, rotate right)k 位,比如陣列 1, 2, 3, 4, 5 迴圈右移 3 位之後就變成 3, 4, 5, 1, 2。

要求:只能用乙個元素大小的附加儲存,元素移動或交換次數為o(n)。

開始時自己想的演算法就是最簡單原始的一種:

每次將陣列右移一位,迴圈k次:

void

function(int *a,int n,int k)

a[0]=tmp;

}}

但這個方法的時間複雜度是o(n*k),不符合題目要求,有沒有更好的演算法呢?

google了發現實現這個的是經典的「三步反轉法」:

記 a 的前 n-k 位為 x,後 k 位為 y,則 a=xy,將 a 迴圈右移 k 位後,應該得到yx。根據該演算法,先將 a 整體倒置,得到 (xy )^t = y^t • x^t,然後將前 k 位倒置,得到 y • x^t,最後將後n-k 位倒置,得到 yx,正好是所求的結果。

這樣我們可以將陣列分為兩段,先將它們全部倒置,再將前k位倒置,再將後n-k位倒置,即 1, 2, 3, 4, 5 變成 5, 4, 3, 2, 1,然後將前 k 位倒置,即 3, 4, 5, 2, 1,再將後n-k 位倒置,即 3, 4, 5, 1, 2,完成。

static void swap(int

array, int i, int j)

static void reverse(int

array, int

begin, int

end)

void ror3(int *array, int n, int k)

陣列迴圈右移

設計乙個演算法,把乙個含有n個元素的陣列迴圈右移k位,要求時間複雜度為o n 且只允許使用兩個附加變數。不合題意的解法如下 我們先試驗簡單的辦法,可以每次將陣列中的元素右移一位,迴圈k次。abcd1234 4abcd123 34abcd12 234abcd1 1234abcd。偽 如下 清單2 33...

陣列迴圈右移

本題要求實現乙個對陣列進行迴圈右移的簡單函式 乙個陣列a中存有n 0 個整數,將每個整數迴圈向右移m 0 個位置,即將a中的資料由 a 0 a1 an 1 變換為 an m an 1 a0a1 an m 1 最後m個數迴圈移至最前面的m個位置 函式介面定義 int arrayshift int a,...

陣列迴圈右移

設計乙個演算法,把乙個含有n個元素的陣列迴圈右移k位,要求時間複雜度為o n 且只允許使用兩個附加變數。不合題意的解法如下 我們先試驗簡單的辦法,可以每次將陣列中的元素右移一位,迴圈k次。abcd1234 4abcd123 34abcd12 234abcd1 1234abcd。偽 如下 清單2 33...