[前端算法]排序算法

在js中一般用到sort方法

js 复制代码
arr.sort((a,b)=>{
	return a-b
})

基础排序

冒泡排序

js 复制代码
function bubbleSort(arr) {

    let len = arr.length;

    for (let i = 0; i < len; i++) {

        for(let j=0;j<len-i-1;j++){

            if(arr[j]>arr[j+1]){

               [arr[j],arr[j+1]] = [arr[j+1],arr[j]]

            }

        }

    }

    console.log(arr);

}
js 复制代码
//改进版 最好的时间复杂度 O(n)

function bubbleSort2(arr) {

    let len = arr.length;

    for (let i = 0; i < len; i++) {

        let flag = false;

        for(let j=0;j<len-i-1;j++){

            if(arr[j]>arr[j+1]){

                flag = true;

               [arr[j],arr[j+1]] = [arr[j+1],arr[j]]

            }

        }

        if(!flag){

            break;

        }

    }

    console.log(arr);

}

选择排序

js 复制代码
function selectionSort(arr) {

    let len = arr.length;

    for(let i=0;i<len;i++){

        for(let j=i+1;j<len;j++){

            if(arr[i]>arr[j]){

                [arr[i],arr[j]] = [arr[j],arr[i]]

            }

        }

    }

    console.log(arr);

}

插入排序

插入排序的核心,找到元素在它前面的那个序列中的正确位置

js 复制代码
function insertionSort(arr) {

    let len = arr.length;

    let temp ; //保存当前变量

    for(let i=1;i<len;i++){

        temp = arr[i];

        let j = i;//j来帮助temp找到自己的位置

        while(j>0 && temp < arr[j-1]){

            arr[j] = arr[j-1];

            j--;

        }

        arr[j] = temp;

  

    }

    console.log(arr);

  
  

}

进阶排序算法

分治思想

分解子问题

求解子问题

合并子问题的解

归并排序

js 复制代码
function mergeSort(arr) {

    const len = arr.length;

    if (len < 2) {

        return arr;

    }

    //计算分割点

    const middle = Math.floor(len / 2);

    //分割数组

    const leftArr = mergeSort(arr.slice(0, middle));

    const rightArr = mergeSort(arr.slice(middle, len));

    //合并两个有序数组

    return merge(leftArr, rightArr);

}
//两个有序数组合并

function merge(leftArr, rightArr) {

    let i = 0;

    let j = 0;

    //初始化结果数组

    const res = [];

    // 检查 leftArr 和 rightArr 是否为 undefined

    const len1 = leftArr? leftArr.length : 0;

    const len2 = rightArr? rightArr.length : 0;

    while (i < len1 && j < len2) {

        if (leftArr[i] < rightArr[j]) {

            res.push(leftArr[i]);

            i++;

        } else {

            res.push(rightArr[j]);

            j++;

        }

    }

    //将剩余的数组元素添加到结果数组中

    while (i < len1) {

        res.push(leftArr[i]);

        i++;

    }

    while (j < len2) {

        res.push(rightArr[j]);

        j++;

    }

    return res;

}

快速排序

js 复制代码
//快速排序 o(nlogn)

function quickSort(arr,left=0,right=arr.length-1){

    //定义递归边界,若数组只有一个元素不用排序

    if(arr.length > 1){

        //下一次划分左右数组的索引位置

        const lineIndex = partition(arr,left,right);

        //对左子数组进行快排

        if(left<lineIndex-1){

            quickSort(arr,left,lineIndex-1);

        }

        //对右子数组进行快排

        if(lineIndex<right){

  

            quickSort(arr,lineIndex,right);

        }

    }

  

    return arr;

}
相关推荐
এ慕ོ冬℘゜14 小时前
ES Promise.all/ Promise.race
前端·javascript·elasticsearch
lisw0515 小时前
发酵算法两大应用方向解析
算法·数学建模
喜欢打篮球的普通人15 小时前
LLVM 前端与优化层:Clang 如何把 C 代码变成 IR
c语言·前端·状态模式
动词ing15 小时前
【题目练习】全排列
算法
大文说跨境15 小时前
亚马逊多店铺用过多款指纹浏览器,说点长期用的实际感受
前端·网络
中屹指纹浏览器svip16 小时前
中屹指纹浏览器和普通 Chrome 有什么区别?
前端·chrome·中屹指纹浏览器
易小尊16 小时前
Dixon-Coles 的 τ 函数,我写错了三次
算法
feixing_fx16 小时前
CSS Grid 入门:二维布局时代的降维打击
前端·css·前端框架·css3
Lank_M16 小时前
JPG的8×8块里只要有条边,白底就保不住255
前端
coding漫漫长路16 小时前
主图纯白检测,阈值放宽到250会放过252的底
前端