Несколько микрооптимизаций:
1,2,3)
int len = arr.length;
...
for (int i = 0; i < len; ++i){
int v = arr[i];
int j = i;
Два раза спасает вас от вычислений i-1, и ++ быстрее i ++.
Не уверен насчет длины (может сохранить добавление смещения при доступе к члену класса).
4,5)
for (/*declared j outside loop*/; j != 0; --j) {
j! = 0 должно быть быстрее, чем j> 0 (на самом деле не ожидайте многого), а --j быстрее, чем j -.
Ну, большинство из них могут зависеть от платформы и вообще ничего не менять.