標籤:nbsp ever 迴圈 info sys temp 數組 迴圈移動 .com
一:問題
設將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逆置
演算法習題---線性表之數組實現迴圈移動