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);
}
}