將長度為n的數組R循環左移P位(0<P<n),即{X₀,X₁,...,Xₙ₋₁} → {Xₚ,Xₚ₊₁,...,Xₙ₋₁,X₀,X₁,...,Xₚ₋₁}。
利用逆序操作的結合性,分三步完成:
Reverse(R, 0, P-1)Reverse(R, P, n-1)Reverse(R, 0, n-1)void Reverse(int R[], int left, int right) {
int temp;
for (int i = left, j = right; i < j; i++, j--) {
temp = R[i];
R[i] = R[j];
R[j] = temp;
}
}
void RotateLeft(int R[], int n, int p) {
if (p <= 0 || p >= n) {
printf("ERROR: Invalid shift amount\n");
return;
}
Reverse(R, 0, p-1);
Reverse(R, p, n-1);
Reverse(R, 0, n-1);
}
| 指標 | 三次逆置法 | 輔助數組法 | 逐位移動法 |
|---|---|---|---|
| 時間複雜度 | O(n) | O(n) | O(n×p) |
| 空間複雜度 | O(1) | O(n) | O(1) |
| 代碼簡潔度 | 高 | 中 | 低 |
0 < p < np=0或p=n時數組不變void*+元素大小可實現泛型版本