in src/main/java/org/apache/commons/lang3/ArrayUtils.java [7098:7134]
public static void shift(final byte[] array, int startIndexInclusive, int endIndexExclusive, int offset) {
if (array == null || startIndexInclusive >= array.length - 1 || endIndexExclusive <= 0) {
return;
}
if (startIndexInclusive < 0) {
startIndexInclusive = 0;
}
if (endIndexExclusive >= array.length) {
endIndexExclusive = array.length;
}
int n = endIndexExclusive - startIndexInclusive;
if (n <= 1) {
return;
}
offset %= n;
if (offset < 0) {
offset += n;
}
// For algorithm explanations and proof of O(n) time complexity and O(1) space complexity
// see https://beradrian.wordpress.com/2015/04/07/shift-an-array-in-on-in-place/
while (n > 1 && offset > 0) {
final int nOffset = n - offset;
if (offset > nOffset) {
swap(array, startIndexInclusive, startIndexInclusive + n - nOffset, nOffset);
n = offset;
offset -= nOffset;
} else if (offset < nOffset) {
swap(array, startIndexInclusive, startIndexInclusive + nOffset, offset);
startIndexInclusive += offset;
n = nOffset;
} else {
swap(array, startIndexInclusive, startIndexInclusive + nOffset, offset);
break;
}
}
}