算法習題---線性表之數組實現循環移動
阿新 • • 發佈:2018-09-01
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)
五:補充---右移
voidMoveR(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逆置
算法習題---線性表之數組實現循環移動