奉上js几大排序大餐

222 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

第七天哟!嘻嘻嘻☺️

前言

身为一个前端小菜鸟,总是有一个飞高飞远的梦想,因此,每点小成长,我都想要让它变得更有意义,为了自己,也为了更多值得的人

开开心心学技术大法~~

开心

来了来了,他真的来了~

正文

首先,我们全局假设数组的长度为n

逗比

算法复杂度介绍

算法是计算机语言中不可获取的,算法的复杂度包含时间复杂度和空间复杂度

时间复杂度指该算法运行所需要的时间,空间复杂度指该算法运行所占用的存储空间

时间复杂度.png

十大排序算法

1. 冒泡排序

原理

从左到右相邻的两个数字依次排序,小的放到左边,大的放到右边,第一次循环过后最右边就会是最大的数字;然后再次从左边第二个元素到 n-1 个元素循环,重复上述过程,依次排序,直到排到第一个元素为止。

算法代码

function bubbleSort (list) {
  for (let i = 0; i < list.length; i++) {
    for (let j = 0; j < list.length - i; j++) {
      if (list[j] > list[j + 1]) {
        let temp = list[j];
        list[j] = list[j + 1];
        list[j + 1] = temp;
      }
    }
  }
  return list;
}

2. 选择排序

原理

选择左起的第一个数字依次与之后的所有元素比较,并用最小的进行替换。之后选择左起的第二个数字依次循环比较,直到排序完最后一个元素。

算法代码

function selectSort (list) {
  for (let i = 0; i < list.length - 1; i++) {
    for (let j = i + 1; j < list.length; j++) {
      if (list[j] < list[i]) {
        let temp = list[i];
        list[i] = list[j];
        list[j] = temp;
      }
    }
  }
  return list;
}

3. 插入排序

原理

前两个元素比较大小,小在左,大在右

将第三个元素和前面两个比较,小在左,大在右

将第四个元素和前面三个比较,小在左,大在右

……

将第n个元素和前面 n-1 个元素比较,小在左,大在右

以上,排序完毕;

算法代码

function insertSort (list) {
  for (let i = 1; i < list.length; i++) {
    for (let j = i; j > 0; j--) {
      if (list[j] < list[j - 1]) {
        let temp = list[j];
        list[j] = list[j - 1];
        list[j - 1] = temp;
      }
    }
  }
  return list;
}

4. 快速排序

算法代码

var quickSort = function(arr) {
 
  if (arr.length <= 1) { return arr; }
 
  var pivotIndex = Math.floor(arr.length / 2);
 
  var pivot = arr.splice(pivotIndex, 1)[0];
 
  var left = [];
 
  var right = [];
 
  for (var i = 0; i < arr.length; i++){
 
    if (arr[i] < pivot) {
 
      left.push(arr[i]);
 
    } else {
 
      right.push(arr[i]);
 
    }
 
  }
 
  return quickSort(left).concat([pivot], quickSort(right));
 
};

复杂度:

n*(n-1)/2

最好的情况下排序一次就可以完成排序

最坏的情况就是所有的数组元素都需要排序,这个时候就会退化成冒泡排序,排序次数:n*(n-1)/2

5. 归并排序

原理

将数组递归成单独的元素进行对位两两比较,小的在前,大的在后,对位比较小的插入到数组最前,对位较大的继续与新的对位元素比较,直到本组被排成从小到大的有序数组,然后再依次沿着递归树往上排序,直到合并成一个新的从小到大的有序数组;

原理示意图

原理示意图

排序代码

function mergeSort (list) {
  function merge (left, right) {
    let list = [];
    while (left[0] && right[0]) {
      if (left[0] < right[0]) {
        list.push (left.shift ());
      } else {
        list.push (right.shift ());
      }
    }
    list = list.concat (left).concat (right);
    return list;
  }
  function sort (arr) {
    if (arr.length === 1) {
      return arr;
    }
    let mid = Math.floor ((arr.length + 1) / 2);
    return merge (sort (arr.slice (0, mid)), sort (arr.slice (mid)));
  }
  return sort (list);
}

6.二分法排序

原理

将左边作为有序序列,右边作为无序序列;从第二个元素开始跟左边做二分法排序

何为二分法?

取左边中点为比较值,无序序列从左到右拿值来跟有序序列的中点值比较,通过大小比较,逐步缩小比较区间,最终将无序序列的值塞入到有序序列正确的位置;

算法代码

var arr = [3,2,23,4,9,1,44,34,9];
 
function two(){
            var len = arr.length;
            var left = 0, right = 0, point = 0;   //定义三个标记位,point就是最中间的位置
            var nArr = [];
            nArr[0] = arr[0];         //定义一个数组后,把arr中第一个数先赋给nArr
            for(var i=1; i<len; i++){
                left = 0;
                var nLen = nArr.length;
                right = nLen;
                for(var j=0; j<nLen; j++){
                    point = Math.floor((left + right)/2);   //取整
                    if(nArr[point] < arr[i]){
                        left = point + 1;          //注意必须加1
                    }else{
                        right = point;
                    }
                    if(right == left){        //如果right和left相等就表示找到了插入的位置 ,插入后,跳出循环
                        nArr.splice(left,0,arr[i]);
                        break;
                    }
                }
            }
           console.log(nArr);
}
  

结语

往期好文推荐「我不推荐下,大家可能就错过了史上最牛逼vscode插件集合啦!!!(嘎嘎~)😄」