Não estou conseguindo fazer um algorítimo que leia um vetor A de inteiros com 10 elementos, e leia outro vetor B de inteiros com 10 elementos, em seguida é para montar um vetor C com a União dos elementos do Vetor A com Vetor B em ordem crescente.
Abaixo segue o que tentei fazer:
public class Exercicio6Q9 {
//inicio do metodo construtor
public static void main(String args[]){
int vetA[] = new int[10];
int vetB[] = new int[10];
int vetC[] = new int[10];
for(int i = 0; i <= vetA.length;i++){
vetA[i] = i;
vetB[i] = i;
if(vetA[i] == vetB[i]){
vetC[i] = vetA[i];
}
System.out.println("VetorA[]= "+vetA[i] +", VetorB[]= "+vetB[i]+", União do VetorA[i] com VetorB[i] -> VetorC[]= "+vetC[i]);
}
}//fim do metodo construtor
}
Você está misturando tudo… crie os dois vetores primeiro e só depois se preocupe em fundí-los no terceiro.
Quanto ao problema em si, se os dois vetores de entrada não estiverem ordenados, só juntar os dois vetores no terceiro e ordená-lo posteriormente; se estiverem ordenados, usar o algoritmo de fusão de vetores será mais eficiente.
Consegui resolver o problema “Parcialmente”, pois da forma como esta descrito no codigo abaixo ficou grande “muitas linhas de codigo”. Gostaria de fazer a mesma coisa só que menos linhas de codigo.
public class Exercicio6Q9 {
//inicio do metodo construtor
public static void main(String args[]){
int vetA[] = new int[10];
int vetB[] = new int[10];
int vetC[] = new int[20];
vetA[0] = 1;
vetA[1] = 2;
vetA[2] = 3;
vetA[3] = 4;
vetA[4] = 5;
vetA[5] = 6;
vetA[6] = 7;
vetA[7] = 8;
vetA[8] = 9;
vetA[9] = 10;
vetB[0] = 11;
vetB[1] = 12;
vetB[2] = 13;
vetB[3] = 14;
vetB[4] = 15;
vetB[5] = 16;
vetB[6] = 17;
vetB[7] = 18;
vetB[8] = 19;
vetB[9] = 20;
if(vetA[0] != vetB[0]){
vetC[0] = vetA[0];
vetC[1] = vetB[0];
System.out.println("A Uniao do Vetor A e Vetor B -> "+vetC[0]+" e "+vetC[1]);
}
if(vetA[1] != vetB[1]){
vetC[2] = vetA[1];
vetC[3] = vetB[1];
System.out.println("A Uniao do Vetor A e Vetor B -> "+vetC[2]+" e "+vetC[3]);
}
if(vetA[2] != vetB[2]){
vetC[4] = vetA[2];
vetC[5] = vetB[2];
System.out.println("A Uniao do Vetor A e Vetor B -> "+vetC[4]+" e "+vetC[5]);
}
if(vetA[3] != vetB[3]){
vetC[6] = vetA[3];
vetC[7] = vetB[3];
System.out.println("A Uniao do Vetor A e Vetor B -> "+vetC[6]+" e "+vetC[7]);
}
if(vetA[4] != vetB[4]){
vetC[8] = vetA[4];
vetC[9] = vetB[4];
System.out.println("A Uniao do Vetor A e Vetor B -> "+vetC[8]+" e "+vetC[9]);
}
if(vetA[5] != vetB[5]){
vetC[10] = vetA[5];
vetC[11] = vetB[5];
System.out.println("A Uniao do Vetor A e Vetor B -> "+vetC[10]+" e "+vetC[11]);
}
if(vetA[6] != vetB[6]){
vetC[12] = vetA[6];
vetC[13] = vetB[6];
System.out.println("A Uniao do Vetor A e Vetor B -> "+vetC[12]+" e "+vetC[13]);
}
if(vetA[7] != vetB[7]){
vetC[14] = vetA[7];
vetC[15] = vetB[7];
System.out.println("A Uniao do Vetor A e Vetor B -> "+vetC[14]+" e "+vetC[15]);
}
if(vetA[8] != vetB[8]){
vetC[16] = vetA[8];
vetC[17] = vetB[8];
System.out.println("A Uniao do Vetor A e Vetor B -> "+vetC[16]+" e "+vetC[17]);
}
if(vetA[9] != vetB[9]){
vetC[18] = vetA[9];
vetC[19] = vetB[9];
System.out.println("A Uniao do Vetor A e Vetor B -> "+vetC[18]+" e "+vetC[19]);
}
}//fim do metodo construtor
}
Consegui resolver o problema “Parcialmente”, pois da forma como esta descrito no codigo abaixo ficou grande “muitas linhas de codigo”. Gostaria de fazer a mesma coisa só que menos linhas de codigo.
[code]
public class Exercicio6Q9 {
//inicio do metodo construtor
public static void main(String args[]){
int vetA[] = new int[10];
int vetB[] = new int[10];
int vetC[] = new int[20];
vetA[0] = 1;
vetA[1] = 2;
vetA[2] = 3;
vetA[3] = 4;
vetA[4] = 5;
vetA[5] = 6;
vetA[6] = 7;
vetA[7] = 8;
vetA[8] = 9;
vetA[9] = 10;
vetB[0] = 11;
vetB[1] = 12;
vetB[2] = 13;
vetB[3] = 14;
vetB[4] = 15;
vetB[5] = 16;
vetB[6] = 17;
vetB[7] = 18;
vetB[8] = 19;
vetB[9] = 20;
if(vetA[0] != vetB[0]){
vetC[0] = vetA[0];
vetC[1] = vetB[0];
System.out.println("A Uniao do Vetor A e Vetor B -> "+vetC[0]+" e "+vetC[1]);
}
if(vetA[1] != vetB[1]){
vetC[2] = vetA[1];
vetC[3] = vetB[1];
System.out.println("A Uniao do Vetor A e Vetor B -> "+vetC[2]+" e "+vetC[3]);
}
if(vetA[2] != vetB[2]){
vetC[4] = vetA[2];
vetC[5] = vetB[2];
System.out.println("A Uniao do Vetor A e Vetor B -> "+vetC[4]+" e "+vetC[5]);
}
if(vetA[3] != vetB[3]){
vetC[6] = vetA[3];
vetC[7] = vetB[3];
System.out.println("A Uniao do Vetor A e Vetor B -> "+vetC[6]+" e "+vetC[7]);
}
if(vetA[4] != vetB[4]){
vetC[8] = vetA[4];
vetC[9] = vetB[4];
System.out.println("A Uniao do Vetor A e Vetor B -> "+vetC[8]+" e "+vetC[9]);
}
if(vetA[5] != vetB[5]){
vetC[10] = vetA[5];
vetC[11] = vetB[5];
System.out.println("A Uniao do Vetor A e Vetor B -> "+vetC[10]+" e "+vetC[11]);
}
if(vetA[6] != vetB[6]){
vetC[12] = vetA[6];
vetC[13] = vetB[6];
System.out.println("A Uniao do Vetor A e Vetor B -> "+vetC[12]+" e "+vetC[13]);
}
if(vetA[7] != vetB[7]){
vetC[14] = vetA[7];
vetC[15] = vetB[7];
System.out.println("A Uniao do Vetor A e Vetor B -> "+vetC[14]+" e "+vetC[15]);
}
if(vetA[8] != vetB[8]){
vetC[16] = vetA[8];
vetC[17] = vetB[8];
System.out.println("A Uniao do Vetor A e Vetor B -> "+vetC[16]+" e "+vetC[17]);
}
if(vetA[9] != vetB[9]){
vetC[18] = vetA[9];
vetC[19] = vetB[9];
System.out.println("A Uniao do Vetor A e Vetor B -> "+vetC[18]+" e "+vetC[19]);
}
}//fim do metodo construtor
}
[/code][/quote]
Quanto à redução de código:
-a inicialização de vetores pode ser feita dessa forma: int vetA[] = {1,2,3,4,5,6,7,8,9,10}.
-os vários ifs podem ser substituídos por um laço com um if apenas dentro dele.
Mesmo com esses ajustes, o código não funcionará direito. Qual o motivo de usar o operador “!=”? Se você precisa ordenar, você precisa de comparadores “<” ou “>”.
E você ainda não respondeu se os dois vetores menores chegam ordenados ou não.
Pela sua implementação você não quer valores repetidos no vetC[], mas iniciou os dois vetores: vetA [] e vet[] B com valores seqüenciais(diferentes), ou seja fica visível no seu código que não há valores iguais nos dois primeiros vetores então este monte de IF´s de verificação é sem utilidade!
Se você está iniciando com valores seqüenciais irá ordenar o quê? ou está ordenando o quê?
Como o vetC [] tem vinte posições caso houvesse valores repetidos não seria totalmente preenchido.
Você poderia gerar números aleatórios para preencher os dois primeiros vetores, fazia a verificação de números repetidos, preenchia o terceiro vetor e depois o ordenava.
estes IF’s serão necessários caso eu peça para o usuário digitar os componentes dos vetores, portanto eu fiz estes IF’s para saber se relamente vai dar certo, pois na união de dois conjuntos não posso mostrar o item repetido no vetorA e no vetorB, devo mostra-lo somente uma vez;
Ex.:
vetA[0] = 0;
vetB[0] = 0;
if(vetA[0] != vetB[0]){
vetC[0] = vetA[0];
vetC[1] = vetB[0];
System.out.println("A Uniao do Vetor A e Vetor B -> "+vetC[0]+" e "+vetC[1]);
}else{
System.out.println("A Uniao do Vetor A e Vetor B -> "+vetC[0]);
}
OBS.: O TESTE ACIMA SERIA NECESSARIO CASO O USUARIO FOSSE INSERIR OS ELEMENTOS DOS VETORES!
Olá Enadrov e Regis!
Seria isto que estou buscando redução de linhas de codigo. Irei fazer isso que vocês me indicaram, depois mostro como ficou, pois não irei fazer isto hoje, ficara para o próximo final de semana.
Existem muitos algoritmos de ordenação, tente ser mais específico e para uma auxilio o livro “Algoritmos Teoria e Prática, Tomas H. Cormen …” é ótimo
Caso os dois vetores iniciais já estiverem ordenados pode fazer o seguinte:
int []primeiro = {2, 3, 6, 9, 10};
int []segundo = {1, 4, 5, 7, 8};
int []terceiro = new int[primeiro.length + segundo.length];
int indicePrimeiro = 0, incideSegudo = 0, incideTerceiro = 0;
//enquanto os dois vetores tiverem elementos para percorrer
while (indicePrimeiro < primeiro.length && incideSegudo < segundo.length) {
if (primeiro[indicePrimeiro] < segundo[incideSegudo]) {
terceiro[incideTerceiro++] = primeiro[indicePrimeiro++];
} else if (primeiro[indicePrimeiro] > segundo[incideSegudo]) {
terceiro[incideTerceiro++] = segundo[incideSegudo++];
} else {
terceiro[incideTerceiro++] = primeiro[indicePrimeiro++];
++incideSegudo; //elimina a duplicacao de elementos
}
}
//passa os elementos que restaram a percorrer para o terceiro vetor
while (indicePrimeiro < segundo.length)
terceiro[incideTerceiro++] = primeiro[indicePrimeiro++];
while (incideSegudo < segundo.length)
terceiro[incideTerceiro++] = segundo[incideSegudo++];
Acredito que exista um passo-a-passo mais simples:
*Colocar valores do array A no array C;
*Colocar valores do array B no array C;
*Aplica um mergesort no array C;
Pesquise em livros de algoritmos sobre o algoritmo de ordenação Mergesort. Abraços!
Acredito que exista um passo-a-passo mais simples:
*Colocar valores do array A no array C;
*Colocar valores do array B no array C;
*Aplica um mergesort no array C;
Pesquise em livros de algoritmos sobre o algoritmo de ordenação Mergesort. Abraços!