|
5 | 5 | public class App { |
6 | 6 | static Ordenate ordenate = new Ordenate(); |
7 | 7 | static Scanner s = new Scanner(System.in); |
8 | | - static String pathInputFile = "/tmp/jogadores.txt"; |
9 | | - // static String pathInputFile = "S:\\Users\\José Victor\\dev\\algorithm-and-data-structures-II\\nba\\ordenacao\\src\\jogadores.txt"; |
| 8 | + // static String pathInputFile = "/tmp/jogadores.txt"; |
| 9 | + static String pathInputFile = "S:\\Users\\José Victor\\dev\\algorithm-and-data-structures-II\\nba\\ordenacao\\src\\jogadores.txt"; |
10 | 10 | // static String pathInputFile = |
11 | 11 | // "/home/jose/coding/algorithm-and-data-structures-II/nba/ordenacao/src/jogadores.txt"; |
12 | 12 |
|
@@ -71,7 +71,13 @@ public static void main(String[] args) { |
71 | 71 | // } |
72 | 72 |
|
73 | 73 | // Método InsertionSort |
74 | | - orderedJogadores = ordenate.insertion_sort(orderedJogadores); |
| 74 | + // orderedJogadores = ordenate.insertion_sort(orderedJogadores); |
| 75 | + // for (Jogador jogador : orderedJogadores) { |
| 76 | + // jogador.imprimir(); |
| 77 | + // } |
| 78 | + |
| 79 | + // Método HeapSort |
| 80 | + orderedJogadores = ordenate.heapSort(orderedJogadores); |
75 | 81 | for (Jogador jogador : orderedJogadores) { |
76 | 82 | jogador.imprimir(); |
77 | 83 | } |
@@ -421,31 +427,94 @@ public Jogador[] selection_sort(Jogador[] arr) { |
421 | 427 | } |
422 | 428 |
|
423 | 429 | public Jogador[] insertion_sort(Jogador[] arr) { |
424 | | - Jogador[] vetor = arr; |
| 430 | + Jogador[] jogadoresOrdenados = arr; |
425 | 431 |
|
426 | | - for (int i = 1; i < vetor.length; i++) { |
427 | | - Jogador temp = vetor[i]; |
| 432 | + for (int i = 1; i < jogadoresOrdenados.length; i++) { |
| 433 | + Jogador temp = jogadoresOrdenados[i]; |
428 | 434 | int j = i - 1; |
429 | 435 |
|
430 | | - while (j >= 0 && vetor[j].getAnoNascimento() > temp.getAnoNascimento()) { |
431 | | - vetor[j + 1] = vetor[j]; |
| 436 | + // faz a ordenação por ano de nascimento |
| 437 | + while (j >= 0 && jogadoresOrdenados[j].getAnoNascimento() > temp.getAnoNascimento()) { |
| 438 | + jogadoresOrdenados[j + 1] = jogadoresOrdenados[j]; |
432 | 439 | j--; |
433 | 440 | } |
434 | 441 |
|
435 | | - if (j >= 0 && vetor[j].getAnoNascimento() == temp.getAnoNascimento()) { |
436 | | - int cmp = vetor[j].getNome().compareToIgnoreCase(temp.getNome()); |
437 | | - while (j >= 0 && vetor[j].getAnoNascimento() == temp.getAnoNascimento() && cmp > 0) { |
438 | | - vetor[j + 1] = vetor[j]; |
| 442 | + // caso ano for igual, verifica os nomes |
| 443 | + if (j >= 0 && jogadoresOrdenados[j].getAnoNascimento() == temp.getAnoNascimento()) { |
| 444 | + // ordena por ordem alfabética |
| 445 | + int cmp = jogadoresOrdenados[j].getNome().compareToIgnoreCase(temp.getNome()); |
| 446 | + while (j >= 0 && cmp > 0 && |
| 447 | + jogadoresOrdenados[j].getAnoNascimento() == temp.getAnoNascimento()) { |
| 448 | + jogadoresOrdenados[j + 1] = jogadoresOrdenados[j]; |
439 | 449 | j--; |
440 | 450 | if (j >= 0) { |
441 | | - cmp = vetor[j].getNome().compareToIgnoreCase(temp.getNome()); |
| 451 | + // caso ainda existirem elementos anteriores, atualiza os nomes a serem |
| 452 | + // comparados |
| 453 | + cmp = jogadoresOrdenados[j].getNome().compareToIgnoreCase(temp.getNome()); |
442 | 454 | } |
443 | 455 | } |
444 | 456 | } |
445 | 457 |
|
446 | | - vetor[j + 1] = temp; |
| 458 | + jogadoresOrdenados[j + 1] = temp; |
447 | 459 | } |
448 | | - return vetor; |
| 460 | + return jogadoresOrdenados; |
| 461 | + } |
| 462 | + |
| 463 | + public void criaHeap(Jogador[] arr, Integer i, Integer f) { |
| 464 | + Jogador aux = arr[i]; |
| 465 | + Integer j = i * 2 + 1; |
| 466 | + while (j <= f) { |
| 467 | + if (j < f) { |
| 468 | + // verifica quem é o maior entre os dois decendentes |
| 469 | + if (arr[j].getAltura() < arr[j + 1].getAltura()) { |
| 470 | + j = j + 1; |
| 471 | + } else if (arr[j].getAltura() == arr[j + 1].getAltura()) { |
| 472 | + // caso os anos forem igual ordena pelo nome |
| 473 | + if (arr[j].getNome().compareTo(arr[j + 1].getNome()) < 0) { |
| 474 | + j = j + 1; |
| 475 | + } |
| 476 | + } |
| 477 | + } |
| 478 | + // caso o maior descendente for maior que o pai, ele se torna o pai |
| 479 | + if (aux.getAltura() < arr[j].getAltura()) { |
| 480 | + arr[i] = arr[j]; |
| 481 | + i = j; |
| 482 | + j = 2 * i + 1; |
| 483 | + } else if (aux.getAltura() == arr[j].getAltura()) { |
| 484 | + // caso os anos forem igual ordena pelo nome |
| 485 | + if (aux.getNome().compareTo(arr[j].getNome()) < 0) { |
| 486 | + arr[i] = arr[j]; |
| 487 | + i = j; |
| 488 | + j = 2 * i + 1; |
| 489 | + } |
| 490 | + } else { |
| 491 | + j = f + 1; |
| 492 | + } |
| 493 | + |
| 494 | + // antigo pai, se torna o ultimo filho analisado |
| 495 | + arr[i] = aux; |
| 496 | + } |
| 497 | + } |
| 498 | + |
| 499 | + public Jogador[] heapSort(Jogador[] arr) { |
| 500 | + Jogador[] jogadoresOrdenados = arr; // armazena o vetor |
| 501 | + Integer n = jogadoresOrdenados.length, i; |
| 502 | + |
| 503 | + // cria heap com os dados |
| 504 | + for (i = (n - 1) / 2; i >= 0; i--) |
| 505 | + criaHeap(jogadoresOrdenados, i, n - 1); |
| 506 | + |
| 507 | + for (i = n - 1; i >= 0; i--) { |
| 508 | + // Coloca o maior elemento na posição correspondente |
| 509 | + Jogador aux = jogadoresOrdenados[0]; |
| 510 | + jogadoresOrdenados[0] = jogadoresOrdenados[i]; |
| 511 | + jogadoresOrdenados[i] = aux; |
| 512 | + |
| 513 | + // reconstrói heap |
| 514 | + criaHeap(jogadoresOrdenados, 0, i - 1); |
| 515 | + } |
| 516 | + |
| 517 | + return jogadoresOrdenados; |
449 | 518 | } |
450 | 519 | } |
451 | 520 | } |
0 commit comments