排序算法(JavaScript 语言实现)

介绍排序算法,使用 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]

上面那三个排序算法性能很他妈垃圾

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值