Ir para conteúdo
Felipp

[Dúvida] Ordenação de Vetores

Recommended Posts

Boa noite pessoal,

 

Tenho umas listas de ordenação em C++ para fazer, e em alguns exercícios eu fiquei com uma dúvida imensa.

O problema é o seguinte:

Tenho que ordenar o vetor em ordem decrescente (até ai tudo bem), mas após isso tenho que imprimir o índice do vetor original. Ou seja, tenho que ordenar e, após isso, imprimir a posição que esse número ocupava ANTES de ser ordenado, e não o valor da posição.

 

EXEMPLO:

v[5] = {1, 3, 4, 6, 2}

Vetor ordenado = {6, 4, 3, 2, 1}

Porém, a saída esperada é:

{3, 2, 1, 4, 0}, que são os índices do vetor original.

 

 

Pesquisando pela internet, vi algumas resoluções que usavam struct, mas não posso usar nada do tipo. Apenas vetores e algoritmos de ordenação.

Alguém pode me dar uma luz?

Grato!

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, _Isis_ disse:

Ordena a cópia do vetor e busca no original.

Obrigado!

Mas ainda tô me batendo na parte da busca :(

Entro sempre em loop infinito quando busco os elementos do vetor ordenado no vetor original.

Esse problema é o Olimpiadas, do SPOJ (http://br.spoj.com/problems/OLIMPJ09/)

#include<iostream>
using namespace std;
int main(){
	int n, m, o, p, b, maior, aux, medalha[100], pos[100], a;
	cin >> n >> m;
	for (int i=0; i <100; i++){
		medalha[i] = 0;
		pos[i] = 0;
	}
	for (int i = 0; i < m; i++){
			cin >> o >> p >> b;
			medalha[o]++;
			medalha[p]++;
			medalha[b]++;
			pos[o]++;
			pos[p]++;
			pos[b]++;
	}
	 for (int i = 0; i < n; i++){
		maior = i;
		for (int j=i; j<n; j++){
			if (medalha[j] > medalha[maior])
				maior = j;
		}
	aux = medalha[i];
	medalha[i] = medalha[maior];
	medalha[maior] = aux;
}
	for (int i = 0; i <n; i++)
		cout << medalha[i] << " ";
	cout << endl;
	for (int i = 0; i <n; i++){
			a = medalha[i];
			for (int j =0; j < n; j++){
			if (pos[j] = a){
				cout << j << " ";
				j = 0;
		}
	}
}
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Implemente o método da bolha, ele é bem simples e eficiente em vetores pequenos.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 29/03/2017 at 00:16, Felipp disse:

EXEMPLO:

v[5] = {1, 3, 4, 6, 2}

Vetor ordenado = {6, 4, 3, 2, 1}

Porém, a saída esperada é:

{3, 2, 1, 4, 0}, que são os índices do vetor original.

 

Felipp, o que  diz está errado pois a saída nesse caso deve ser {1,3,4,6,2} já que são os valores do vetor antes de ele ser ordenado. Lendo o seu enunciado vejo que o que você quer fazer é ordenar os valores em um vetor mas somente após isso mostrar esse vetor com os seus valores antes dessa ordenação. Sendo assim dá para fazer exatamente como a _Isis_ e o r.vinícius dizem e aplicar um algoritmo de ordenação nesse vetor após fazer uma cópia dele para poder mostrar na tela os valores em sua ordem original antes dessa ordenação. Aqui vai o código para isso: 

#include<iostream.h>

int main(){
  int v[5]={1,3,4,6,2};
  int vcopia[5],aux;
  for(int i=0; i<5; i++)
    vcopia[i]=v[i];  
  for(int i=0; i<4; i++)
    for(int j=i+1; j<5; j++)
      if(v[i]<v[j]){
        aux=v[i];
        v[i]=v[j];
        v[j]=aux;
      }
  for(int i=0; i<5; i++)
    cout << vcopia[i] << " ";  
  system("pause");
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por Sharank
      Strcat Function In C++
       
      I'm new to C and C++ programming, can anyone give me a hint on what I'm doing wrong here. I'm trying to write to concat function that takes to pointers to chars and concatenates the second to the first. The code does do that, but the problem is that it adds a bunch of junk at the end.
       
      For instance, when passing the arguments - "green" and "blue", the output will be "greenblue" plus a bunch of random characters. I also wrote the strlen function that strcat uses, which I will provide below it for reference. I'm using the online compiler at InterviewBit The exact instructions and specification is this:
       
      int main(int argc, char** argv)
      {
      const int MAX = 100;
       
      char s1[MAX];
      char s2[MAX];
       
      cout << "Enter your first string up to 99 characters. ";
      cin.getline(s1, sizeof(s1));
      int size_s1 = strlen(s1);
      cout << "Length of first string is " << size_s1 << "\n";
       
      cout << "Enter your second string up to 99 characters. ";
      cin.getline(s2, sizeof(s2));
      int size_s2 = strlen(s2);
      cout << "Length of second string is " << size_s2 << "\n";
      cout << " Now the first string will be concatenated with the second
      string ";
      char* a = strcat(s1,s2);
       
      for(int i = 0; i<MAX; i++)
      cout <<a;
       
      // system("pause");
      return 0;
      }
       
      //strcat function to contatenate two strings
      char* strcat(char *__s1, const char *__s2)
      {
      int indexOfs1 = strlen(__s1);
      int s2L = strlen(__s2);
      cout <<s2L << "\n";
      int indexOfs2 = 0;
      do{
      __s1[indexOfs1] = __s2[indexOfs2];
      indexOfs1++;
      indexOfs2++;
      }while(indexOfs2 < s2L);
       
       
      return __s1;
      }
       
      //Returns length of char array
      size_t strlen(const char *__s)
      {
      int count = 0;
      int i;
      for (i = 0; __s != '\0'; i++)
      count++;
      return (count) / sizeof(__s[0]);
       
      }
    • Por roberson abalaid
      #include <stdio.h>
      #include <stdlib.h>
      int arr[3][5];
      int main(){
          
          printf("Favor inserir os dados...\n");
          
          for(int i = 0; i < 3; i++){
              for(int j = 0; j < 5; j++){
                  scanf("%d", &arr[j]);
              }
          }
          
            printf("os valores inseridos foram...\n");
          
          for(int i = 0; i < 3; i++){
              for(int j = 0; j < 5; j++){
                  printf("  %d  ", arr[j]);
              }
              printf("\n");
          }
          return 0;
      }
    • Por flipmartinz13
      Alguém pode me ajudar nessa questão de C++? não estou conseguindo construir o algorítmo corretamente.

      5.92)    Faça um algoritmo que leia a matrícula, nome, sexo e três notas dos alunos de uma escola e obtenha os seguintes resultados:
      a) A matrícula da aluna que obteve a maior média.
      b) A matrícula do aluno que obteve a menor média.
      c) O percentual de mulheres na turma.
      d) Quantos alunos foram aprovados, independente do sexo.
      e) O percentual de alunas aprovadas.
      Obs.: o flag é uma matrícula igual a 0 (zero).
    • Por flipmartinz13
      Estou tentando fazer esse exercício de introdução a programação em C++, e estou tendo dificuldades para criar os algoritmos. Alguém poderia me ajudar?


      Uma agência de turismo quer fazer um levantamento das praias da cidade para um programação turística de verão, sabendo-se que cada praia tem um nome e uma distância (em Km) do hotel. Criar um algoritmo que forneça os seguintes dados:
      18

       Porcentagem de turistas nas praias próprias do hotel
       A praia mais adiante
       Nome e distancia das praias não-próprias com distancia do hotel maior que 10 km.
      O algoritmo acaba quando se digita @ para nome da praia.
    • Por EstilloWeb
      Está ocorrendo um erro em meu comando MySQL na ordenação dos resultados. O código é o seguinte:
      $sql_imos4 = "Select DISTINCT imovel FROM propostas ORDER BY id DESC"; $exe_imos4 = mysqli_query($conexao, $sql_imos4); O objetivo é listar uma única vez um imóvel com proposta, mesmo que haja dois ou mais registros, sempre ordenado mais recente. O que está ocorrendo quando o imóvel tem mais de uma proposta cadastrada, a ordenação está sendo feita pelo ID da proposta mais antiga.
      Exemplo:
      imóvel ref. 4528 tem duas propostas, sendo que a mais recente tem o ID 235 porém aparece na listagem abaixo do imóvel ref. 4325, que tem uma só proposta e ID 230.
      O resultado deveria estar invertido neste caso.
      Onde pode estar o erro? Agradeço a ajuda.
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.