Imagine que você tenha o seguinte array na entrada
x = {1,2,3,4,5,6};
O tamanho de seu array, x.length é 6 e esse é o valor inicial que você está passando para j.
Só que o último índice do seu array não é 6, é 5, ou seja, x.length-1.
No segundo loop, o j é decrescente, logo não a condição de parada não deve ser j<x.length e sim j > 0;
Além disso, quando você faz x[i] = x[j], você está jogando o valor em x[i] fora. Na primeira iteração do seu loop (corrigindo os erros anteriores) você teria o seguinte vetor {6,2,3,4,5,6} e com isso não teria como jogar o valor 1 na última posição.
Além do mais, mesmo que isso seja corrigido, quando a iteração do seu programa chegasse na metade, ele desfazeria tudo o que fez anteriormente.
Pelo que vi é porque teu laço deve ir até metade do array na ida e também até o meio na volta, pois senão tu vai voltar ao array original e também precisa de uma variável temporária pra não perder o valor de uma das posições, como estava acontecendo no teu primeiro exemplo…