1.快速排序

class QuickSort {
Sort(originalArray) {
// 复制 originalArray 数组防止它被修改
const array = [...originalArray];
// 如果 originalArray 数组元素个数 <=1,就不需要排序了,直接返回
if (array.length <= 1) {
return array;
}
// 初始化左数组和右数组
const leftArray = [];
const rightArray = [];
// 取出 originalArray 数组中的第一个元素作为中间比较值
const pivotElement = array.shift();
const centerArray = [pivotElement];
// 把 originalArray 数组拆分成左、中、右三个数组
while (array.length) {
const currentElement = array.shift();
if (currentElement == pivotElement) {
centerArray.push(currentElement);
} else if (currentElement < pivotElement) {
leftArray.push(currentElement);
} else {
rightArray.push(currentElement);
}
}
// 递归对左、右数组进行排序
const leftArraySorted = this.Sort(leftArray);
const rightArraySorted = this.Sort(rightArray);
// 最后把排好序的左、中、右数组拼接起来,并返回
return leftArraySorted.concat(centerArray, rightArraySorted);
}
}
2.选择排序

class SelectionSort{
Sort(originalArray){
// 复制 originalArray 防止它被修改
const array = [...originalArray];
for(let i = 0; i<array.length - 1; i += 1){
let minIndex = i;
// 查找剩余数组中的最小元素
for(let j = i+1; j<array.length; j += 1){
if(array[j] < array[minIndex]){
minIndex = j;
}
}
// 如果找到新的最小元素,就把它和当前元素进行交换
if(minIndex !== i){
const tmp = array[i];
array[i] = array[minIndex];
array[minIndex] = tmp;
}
}
return array;
}
}
3.冒泡排序

class BubbleSort {
// 常见的写法
Sort1(originalArray) {
const array = [...originalArray];
for (let i = 1; i < array.length; i += 1) {
let swapped = false;
for (let j = 0; j < array.length - i; j += 1) {
if (array[j] > array[j + 1]) {
const tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
swapped = true; // 记录是否交换过元素
}
}
if (!swapped) { // 如果未发生过交换(swapped = false),则表明已经排好序,结束循环
return array;
}
}
}
// 常见的写法(循环语句换成:do..while 方式)
Sort2(originalArray) {
const array = [...originalArray]; // 在原始数组的副本上修改
let n = array.length;
let swapped = false;
do {
swapped = false;
for (let i = 1; i < n; i += 1) {
if (array[i - 1] > array[i]) {
const tmp = array[i - 1];
array[i - 1] = array[i];
array[i] = tmp;
swapped = true; // 记录是否交换过元素
}
}
n = n - 1; // 最后一个元素以排好序,所以下一次它不需参与比较
} while (swapped); // 如果未发生过交换(swapped = false),则表明已经排好序,结束循环
return array;
}
// 优化后的冒泡排序算法
// 来源:https://en.wikipedia.org/wiki/Bubble_sort
Sort3(originalArray) {
const array = [...originalArray]; // 在原始数组的副本上修改
let n = array.length;
do {
let newn = 0;
for (let i = 1; i < n; i += 1) {
if (array[i - 1] > array[i]) {
const tmp = array[i - 1];
array[i - 1] = array[i];
array[i] = tmp;
newn = i; // 记录最后一次被交换的元素位置
}
}
n = newn; // 只需比较至上一次发生交换的地方即可
} while (n > 1); // 如果交换位置已移动到起始元素(n <= 1),则表明已经排好序,结束循环
return array;
}
}
原文地址:https://github.com/trekhleb/javascript-algorithms