Escreva um programa que leia um vetor de inteiros de 11 posições, e em seguida imprima a mediana desse vetor. A mediana de um vetor é o valor que se encontra exatamente no meio do vetor.
Observações!!
-
você não pode alterar o vetor (modificar os valores do vetor, nem mover os elementos de posição);
-
você não pode usar vetores auxiliares para essa questão.
Exemplo de Entrada
6 7 10 1 4 5 15 2 3 9 8
Exemplo de Saída
6
A minha dúvida é como vou encontrar a mediana sem ordenar o vetor;
Seguindo a definição de mediana (ok, fonte nem tão confiável), você não precisa de dados ordenados para encontrar a mediana.
Aproveitando: cara, títulos como help, urgente, ajuda, mimimi não fazem do teu tópico uma coisa mais atrativa.
Coloque títulos claros, escreva, releia a tua questão. Isso é o que facilita e amplia o número de respostas.
1 curtida
import java.util.Scanner;
public class main{
public static void main(String[] args){
Scanner leia = new Scanner(System.in);
int [] vetor = new int [11];
int cont, mediana;
for(cont = 0; cont < 11; cont++){
vetor[cont] = leia.nextInt();
}
int left = 0;
int right = vetor.length-1;
int half;
half = (left + right)/2;
mediana = vetor[half];
System.out.println(mediana);
}
}
No exemplo de saída está dando 5, mas no exemplo de entrada a resposta é 6
Corrigindo o que eu comentei anteriomente
A mediana de uma lista finita de números pode ser encontrada organizando os números do menor para o maior
Portanto, você vai ser obrigado a ordenar os números inseridos.
Olha as observações
Observações!!
você não pode alterar o vetor (modificar os valores do vetor, nem mover os elementos de posição);
Neste caso, voltamos ao ponto original.
A mediana é:
- Em um conjunto de dados com um número ímpar de elementos: o elemento do meio
- Em um conjunto de dados com um número par de elementos: a soma dos dois elementos do meio e o resultado dividido por 2
Você está seguindo pelo primeiro raciocínio e, por isso, o resultado da execução do teu código é 5
eu acho que a questão está errada, pois o vetor é de 11 elementos, ou seja, a mediana é o elemento do meio que é 5 e não 6.
Perguntei de um amigo ele disse que a mediana em um vetor desordenado é o valor que 50% dos são outros menores que ele e os outros 50% são maiores que ele.
Olá amigo, resolvi da seguinte maneira.
private static void calculaMediana() {
Scanner leia = new Scanner(System.in);
int[] vetor = new int[11];
int mediana = 0;
for (int cont = 0; cont < 11; cont++) {
vetor[cont] = leia.nextInt();
}
for (int i : vetor) {
System.out.println(i);
}
int fixo, contadorMenor = 0;
for (int j = 0; contadorMenor != 5; j++) {
fixo = vetor[j];
contadorMenor = 0;
for (int i = 0; i < 11; i++) {
if (fixo < vetor[i]) {
contadorMenor++;
if (contadorMenor == 5) {
for (int k = i; k < 11; k++) {
if(fixo>vetor[k]||k==10) {
mediana = fixo;
}
}
}
if (contadorMenor > 5) {
contadorMenor = 0;
}
}
}
}
System.out.println("Mediana é: "+mediana);
}
Opa, melhorando o código e deixando ele mais simples, podemos fazer assim:
private static void calculaMediana() {
Scanner leia = new Scanner(System.in);
int[] vetor = new int[11];
int mediana = 0;
for (int cont = 0; cont < 11; cont++) {
vetor[cont] = leia.nextInt();
}
int fixo, contadorMenor = 0;
for (int j = 0; contadorMenor != 5; j++) {
fixo = vetor[j];
contadorMenor = 0;
for (int i = 0; i < 11; i++) {
if (fixo < vetor[i]) {
contadorMenor++;
if (contadorMenor >= 5) {
if (contadorMenor > 5) {
break;
}else {
mediana = fixo;
}
}
}
}
}
System.out.println("Mediana é: "+mediana);
}
Vou tentar te explicar, pera.
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.