Matrix Ordering with Values Exchange

4
Good afternoon! I mounted an array that receives 9 records from a single variable and the values are displayed on the user's screen. However, when trying to put this array in ascending order, I tried to use the value exchange method, but at the time of applying it to this algorithm, the last three values typed via keyboard were repeated three times:

var linha = Array(3,3);
var x, y, troca;
for (x = 0; x < 3; x++) {
  for (y = 0; y < 3; y++) {
      linha[x,y] = parseInt(prompt("Digite o "+[y+1]+"º número da "+[x+1]+"º coluna"));
  }
}
for (x = 0; x < 3; x++) {
  for (y = 0; y < 3; y++) {
    if (linha[x] < linha[y]){
      troca = linha[x];
      linha[x] = linha[y];
      linha[y] = troca;
    }
  }
}
for (x = 0; x < 3; x++) {
  for (y = 0; y < 3; y++) {
    document.write(linha[x,y]+"&nbsp&nbsp");
  }
  document.write("<br>");
}

Question: Which method would be simpler and more logical to sort the 9 numbers entered by the user in ascending order in this problem presented?

    
asked by anonymous 11.12.2018 / 22:03

1 answer

3

What is happening is that the "Array (3,3)" command does not create a 9-position array, but an array with only two positions, the index 0 = > 3 and the index 1 = > 3. In javascript, when using the Array function, every element passed by "," is considered an item. To resolve this, you will do the following:

// Função de comparação numérica básica, será utilizada
// para testar os números e saber qual é maior que qual
function sortNumber(a,b) {
    return a - b;
}

// Criar um Quadrado de quantos lados?
// Criei esta variável para caso queira aumentar as posições,
// basta informar aqui
var lados = 3;

// Será criado um array com 'n lados, depende da variável' mas, vazios.
var linha = new Array(lados * lados);

var x, y, troca;
for (x = 0; x < lados; x++) {
  for (y = 0; y < lados; y++) {
      // Utilizando o x * lados, vamos ter as seguintes posições
      // x = 0 e y = 0 === 0 - Posição 1 do Array
      // x = 0 e y = 1 === 1 - Posição 2 do Array
      // x = 0 e y = 2 === 2 - Posição 3 do Array
      // x = 1 e y = 0 === 3 - Posição 4 do Array
      // x = 1 e y = 1 === 4 - Posição 5 do Array
      // x = 1 e y = 2 === 5 - Posição 6 do Array
      // x = 2 e y = 0 === 6 - Posição 7 do Array
      // x = 2 e y = 1 === 7 - Posição 8 do Array
      // x = 2 e y = 2 === 8 - Posição 9 do Array       
      linha[(x * lados) + y] = parseInt(prompt("Digite o "+[y+1]+"º número da "+[x+1]+"º coluna"));
  }
}

// Removido esta parte, basta utilizar o comando SORT do Array passando uma função para ordenar.
// for (x = 0; x < 3; x++) {
//   for (y = 0; y < 3; y++) {
//     if (linha[x] < linha[y]){
//       troca = linha[x];
//       linha[x] = linha[y];
//       linha[y] = troca;
//     }
//   }
// }

// Vai ordenar os itens do array, passando como parâmetro a função que criamos
linha = linha.sort(sortNumber)

for (x = 0; x < lados; x++) {
  for (y = 0; y < lados; y++) {
    // Alterado a forma como acessar o índice do array.
    // Ficou x * lados + y para acessar de forma correta as posições
    document.write(linha[(x * lados) + y]+"&nbsp&nbsp");
  }
  document.write("<br>");
}
    
13.12.2018 / 03:07