介绍排序算法,使用 JavaScript 语言实现。具体如何实现就不多介绍,至于我是从哪个角度去介绍的呢,我他妈的也说不清。一个有趣的网站 数据结构和算法动态可视化
下文会用的函数
// 静态变量
const Compare = {
LESS_THAN: -1,
BIGGER_THAN: 1,
};
// 比较大小
function defaultCompare(a, b) {
if (a === b) {
return 0;
}
return a < b ? Compare.LESS_THAN : Compare.BIGGER_THAN;
}
// 交换数组的值
function swap(array, a, b) {
[array[a], array[b]] = [array[b], array[a]];
}
// 预备被排序的数组
const ARRAY_DEFAULT = [29, 10, 14, 37, 18];
冒泡排序
冒泡排序是双层循环的,外层循环次数为数组个数,内层循环每次比较相邻 2 个数的大小,符合条件的调换位置。内层循环最优化是不去循环那些已经排好序的元素。
function modifiedBubbleSort(array, compareFn = defaultCompare) {
const { length } = array;
for (let i = 0; i < length; i++) {
for (let j = 0; j < length - 1 - i; j++) {
if (compareFn(array[j], array[j + 1]) === Compare.BIGGER_THAN) {
swap(array, j, j + 1);
}
}
}
return array;
}
console.log(modifiedBubbleSort(ARRAY_DEFAULT)); // [10, 14, 18, 29, 37]
选择排序
选择排序也是个双循环。外层循环次数为数组个数。按从小到大排序,先假设外层循环当前的元素是此次循环最小的,然后内层循环遍历数组剩下的部分,如果找到更小的,和当前外层标记的最小元素互换位置(也就是值互换)。
function selectionSort(array, compareFn = defaultCompare) {
const { length } = array;
let indexMin;
for (let i = 0; i < length - 1; i++) {
indexMin = i;
for (let j = i; j < length; j++) {
if (compareFn(array[indexMin], array[j]) === Compare.BIGGER_THAN) {
indexMin = j;
}
}
if (i !== indexMin) {
swap(array, i, indexMin);
}
}
return array;
}
console.log(selectionSort(ARRAY_DEFAULT)); // [10, 14, 18, 29, 37]
插入排序
插入排序还是他妈的双循环。先假设数组的第一项是排好序的,所以 i 从 1 开始。外层循环每次都记住当前外层循环的值 temp,相当于值拿出来了,这个位置空下了。每次外层循环时,内层循环的指针都是先和外层的指针一致。
不过这里的不同是内层循环的指针是往数组的低下标去走的,内层循环当前下标-1 的值 比 temp 值的大时,把当前下标-1 的值挪到内层循环当前下标,也就是向右挪一位,直到不符合条件的内层循环。那么,当前内层循环的指针位置就是外层循环那个 temp 值该处的位置。
为什么呢?这是因为外层保存的 temp 值是外层循环的新值,在内层的判断下,temp 值刚刚好到达一个比前面所有值都大的位置。(默认小到大排序)
function insertionSort(array, compareFn = defaultCompare) {
const { length } = array;
let temp;
for (let i = 1; i < length; i++) {
let j = i;
temp = array[i];
while (j > 0 && compareFn(array[j - 1], temp) === Compare.BIGGER_THAN) {
array[j] = array[j - 1];
j--;
}
array[j] = temp;
}
return array;
}
console.log(insertionSort(ARRAY_DEFAULT)); // [10, 14, 18, 29, 37]
上面那三个排序算法性能很他妈垃圾