5.10. Демонстрация - Топ лучших (модифицированная сортировка пузырьком)

Шаг 1

Самый простой вариант решения этой задачи — неполная сортировка пузырьком. Это практически полная копия сортировки пузырьком из демо-реализации, только мы всегда делаем три итерации (или меньше, если игроков меньше).


import {log} from './logger';

function topThree(data) {

}

const data = [
  {
    "login": "DreamLess",
    "leaguePoints": 956
  },
  {
    "login": "cavernous",
    "leaguePoints": 1056
  },
  {
    "login": "SaiyanBroadway",
    "leaguePoints": 1432
  },
  {
    "login": "BlondiePlanet",
    "leaguePoints": 1045
  },
  {
    "login": "Mountaintrid",
    "leaguePoints": 1130
  },
  {
    "login": "cathead",
    "leaguePoints": 930
  },
  {
    "login": "rstrazir",
    "leaguePoints": 356
  },
  {
    "login": "stypeano",
    "leaguePoints": 4
  },
  {
    "login": "CzarStories",
    "leaguePoints": 568
  },
  {
    "login": "ConspiracyLil",
    "leaguePoints": 18
  },
  {
    "login": "GottaSaiyan",
    "leaguePoints": 931
  },
  {
    "login": "Goldenelox",
    "leaguePoints": 932
  },
  {
    "login": "Breakingbing",
    "leaguePoints": 64
  },
  {
    "login": "Rectionom",
    "leaguePoints": 42
  },
  {
    "login": "BoostScooby",
    "leaguePoints": 1476
  },
  {
    "login": "JoshChase",
    "leaguePoints": 931
  }
];

log(topThree(data)); // Должен получить игроков BoostScooby, SaiyanBroadway, Mountaintrid

Шаг 2

Можно взять алгоритм сортировки практически полностью: нужно заменить только количество итераций и сравнение элементов.


import {log} from './logger';

function topThree(data) {
  // Итерироваться будем три раза, либо, если в массиве меньше элементов, на один меньше его длины, как и в обычной сортировке
  const iterations = Math.min(data.length - 1, 3);

  for (let i = 0; i < iterations; i++) {
    // а вот внутри итерации всё ещё будем проходить полный массив, тут ничего не меняется
    for (let j = 0; j < data.length - 1; j++) {
      if (data[j].leaguePoints > data[j + 1].leaguePoints) {
        [data[j], data[j + 1]] = [data[j + 1], data[j]];
      }
    }
  }
}

const data = [
  {
    "login": "DreamLess",
    "leaguePoints": 956
  },
  {
    "login": "cavernous",
    "leaguePoints": 1056
  },
  {
    "login": "SaiyanBroadway",
    "leaguePoints": 1432
  },
  {
    "login": "BlondiePlanet",
    "leaguePoints": 1045
  },
  {
    "login": "Mountaintrid",
    "leaguePoints": 1130
  },
  {
    "login": "cathead",
    "leaguePoints": 930
  },
  {
    "login": "rstrazir",
    "leaguePoints": 356
  },
  {
    "login": "stypeano",
    "leaguePoints": 4
  },
  {
    "login": "CzarStories",
    "leaguePoints": 568
  },
  {
    "login": "ConspiracyLil",
    "leaguePoints": 18
  },
  {
    "login": "GottaSaiyan",
    "leaguePoints": 931
  },
  {
    "login": "Goldenelox",
    "leaguePoints": 932
  },
  {
    "login": "Breakingbing",
    "leaguePoints": 64
  },
  {
    "login": "Rectionom",
    "leaguePoints": 42
  },
  {
    "login": "BoostScooby",
    "leaguePoints": 1476
  },
  {
    "login": "JoshChase",
    "leaguePoints": 931
  }
];

log(topThree(data)); // Должен получить игроков BoostScooby, SaiyanBroadway, Mountaintrid

Шаг 3

Ещё одно место для изменений в том, что нам нужно вернуть только три последних элемента. Сделаем это простым slice.


import {log} from './logger';

function topThree(data) {
  // Итерироваться будем три раза, либо, если в массиве меньше элементов, на один меньше его длины, как и в обычной сортировке
  const iterations = Math.min(data.length - 1, 3);

  for (let i = 0; i < iterations; i++) {
    // а вот внутри итерации всё ещё будем проходить полный массив, тут ничего не меняется
    for (let j = 0; j < data.length - 1; j++) {
      if (data[j].leaguePoints > data[j + 1].leaguePoints) {
        [data[j], data[j + 1]] = [data[j + 1], data[j]];
      }
    }
  }

  return data.slice(-3);
}

const data = [
  {
    "login": "DreamLess",
    "leaguePoints": 956
  },
  {
    "login": "cavernous",
    "leaguePoints": 1056
  },
  {
    "login": "SaiyanBroadway",
    "leaguePoints": 1432
  },
  {
    "login": "BlondiePlanet",
    "leaguePoints": 1045
  },
  {
    "login": "Mountaintrid",
    "leaguePoints": 1130
  },
  {
    "login": "cathead",
    "leaguePoints": 930
  },
  {
    "login": "rstrazir",
    "leaguePoints": 356
  },
  {
    "login": "stypeano",
    "leaguePoints": 4
  },
  {
    "login": "CzarStories",
    "leaguePoints": 568
  },
  {
    "login": "ConspiracyLil",
    "leaguePoints": 18
  },
  {
    "login": "GottaSaiyan",
    "leaguePoints": 931
  },
  {
    "login": "Goldenelox",
    "leaguePoints": 932
  },
  {
    "login": "Breakingbing",
    "leaguePoints": 64
  },
  {
    "login": "Rectionom",
    "leaguePoints": 42
  },
  {
    "login": "BoostScooby",
    "leaguePoints": 1476
  },
  {
    "login": "JoshChase",
    "leaguePoints": 931
  }
];

log(topThree(data)); // Должен получить игроков BoostScooby, SaiyanBroadway, Mountaintrid

File logger


const results = document.getElementById('results')

export function log(players) {
  for (const {login, leaguePoints} of players) {
    const result = document.createElement('li');

    result.innerHTML = `${login} со счетом ${leaguePoints}`

    results.appendChild(result);
  }
}