Forked from famence/javascript-sorting-algorithms.js
Last active
January 10, 2020 21:57
-
-
Save levvsha/8a6fa0d13e13857f154e47b3f0ed9b91 to your computer and use it in GitHub Desktop.
Реализация популярных алгоритмов сортировки на JavaScript с комментариями-пояснениями
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Пузырьковая сортировка | |
function bubbleSort(a){ | |
var n = a.length; | |
for (var i = 0; i < n-1; i++){ // Выполняется для каждого элемента массива, кроме последнего. | |
for (var j = 0; j < n-1-i; j++){ // Для всех последующих за текущим элементов | |
if (a[j+1] < a[j]){ // выпоняется проверка, и если следующий элемент меньше текущего | |
var t = a[j+1]; a[j+1] = a[j]; a[j] = t; // то эти элементы меняются местами. | |
} | |
} | |
} | |
return a; | |
}; | |
// Сортировка выбором | |
function selectionSort(a){ | |
var n = a.length; | |
for (var i=0; i<n-1; i++){ // Выполняется для каждого элемента массива, кроме последнего. | |
var min = i; // В качестве текущего минимального устанавливается текущий элемент, | |
for (var j=i+1; j<n; j++){ // а для всех последующих элементов | |
if (a[j] < a[min]) min = j; // выпоняется проверка: если следующий элемент меньше текущего, он устанавливается в качестве минимального значения. | |
var t = a[min]; a[min] = a[i]; a[i] = t; // Минимальный и текущий элементы меняются местами (если текущий = минимальный, то ничего страшного не случится). | |
} | |
} | |
return a; | |
}; | |
// Сортировка вставками | |
function insertionSort(a){ | |
var n = a.length; | |
for (var i=0; i<n; i++){ // Выполняется для каждого элемента массива. | |
var v = a[i], j = i-1; // Определяется значение текущего элемента, а также индекс предыдущего элемента. | |
while(j >= 0 && a[j] > v){ // Пока индекс предыдущего элемента >= 0 и его значение больше значения текущего элемента. | |
a[j+1] = a[j]; // Значением следующего за текущим элемента массива становится значение предыдущего элемента. | |
j--; | |
} | |
a[j+1] = v; // Значением следующего за текущим элемента массива становится значение текущего элемента | |
} | |
return a; | |
}; | |
// Быстрая сортировка | |
function swap(items, firstIndex, secondIndex){ | |
const temp = items[firstIndex]; | |
items[firstIndex] = items[secondIndex]; | |
items[secondIndex] = temp; | |
} | |
function partition(items, left, right) { | |
var pivot = items[Math.floor((right + left) / 2)], //в качества разделителя берем элемент из середины | |
i = left, | |
j = right; | |
while (i <= j) { // до тех пор, пока левый указатель меньше или равен правому... | |
while (items[i] < pivot) { | |
i++; // сдвигаем указатель от левого края к центру если очередной элемент меньше разделителя | |
} | |
while (items[j] > pivot) { | |
j--;// сдвигаем указатель от правого края к центру если очередной элемент больше разделителя | |
} | |
if (i <= j) { // если в резултате сдвигов левый указатель больше или равен правому | |
swap(items, i, j); // меняем местами значения под левым и правым указателем | |
i++; | |
j--; | |
} | |
} | |
return i; | |
} | |
function quickSort(items, left, right) { | |
var index; | |
if (items.length > 1) { // если длина массива больше 1 | |
index = partition(items, left, right); // запускаем partition и сохраняем индекс | |
if (left < index - 1) { | |
quickSort(items, left, index - 1); // запускаем quickSort для левой части | |
} | |
if (index < right) { | |
quickSort(items, index, right); // запускаем quickSort для правой части | |
} | |
} | |
return items; | |
} | |
let array = [85, 92, 12, 11, 0, 85, 1, 1, 20, 77, 01, 10.5, 10.15]; | |
var result = quickSort(array, 0, array.length - 1); | |
console.log('quick ', result); | |
console.log(bubbleSort(array)); | |
console.log(selectionSort(array)); | |
console.log(insertionSort(array)); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment