Vou tentar te explicar o que eu fiz ai, mas você também pode debugar para esclarecer melhor.
Bem a lógica é exatamente a que você mencionou, 50% serão menor que a mediana (Caso o números de elementos sejam impares), logo a gente não precisa verificar se este valor também é 50% maior que o restante do vetor, basta garantir que se o número for maior que 50% ele pare e verifica outro, pois ele tem que ser exatamente 50% menor que o restantes dos elementos.
Entendendo isso, a gente cria o primeiro for, este será responsável por percorrer o vetor armazenando um valor fixo que será comparado com todo o resto, no primeiro for a gente também controla a questão dele ser 50% menor que o restante dos elementos, pois ele só deverá sair desse laço quando encontrar exatamente o elemento. Devemos zerar a variável contadorMenor, pois ela foi utilizada no for seguinte e logo entenderemos.
O segundo for será responsável por percorrer o vetor e assim podemos verificar se a variável fixo (Controlada pelo for anterior) é menor que o elemento do vetor na posição [ i ], se sim começaremos a contagem, adicionando +1 cada vez que o valor fixo for menor que o elemento da posição atual. se ele valor chegar a 5, significa que ele chegou em 50% dos valores, ou seja, esse número é sim 50% menor que o restante, mas ainda temos que garantir que ele seja apenas 50% menor e nada mais, entendeu? dai vem outro if verificando se ele é mais que 50% menor que o restante se sim e da um break (Sai do primeiro laço e retorna para o laço antecessor). Caso ele não ultrapasse esse valor do contador, ou seja, ele será exatamente igual a 5, Opa, esse é o cara que queremos
.
Espero que tenha entendido, achei legal o desafio, obrigado.