Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save levvsha/8a6fa0d13e13857f154e47b3f0ed9b91 to your computer and use it in GitHub Desktop.
Save levvsha/8a6fa0d13e13857f154e47b3f0ed9b91 to your computer and use it in GitHub Desktop.
Реализация популярных алгоритмов сортировки на JavaScript с комментариями-пояснениями
// Пузырьковая сортировка
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