Help

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!!

  1. você não pode alterar o vetor (modificar os valores do vetor, nem mover os elementos de posição);

  2. 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

E qual é a duvida?

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 :slight_smile:.

Espero que tenha entendido, achei legal o desafio, obrigado.

Cara, muito obrigado!

1 curtida