前端常见排序算法

冒泡排序

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

插入排序


/**双层循环,外循环控制未排序的元素,内循环控制已排序的元素,将未排序元素设为标杆,
与已排序的元素进行比较,小于则交换位置,大于则位置不动
*/
function insertSort(arr) {
    let tem
    for(let i=0; i<arr.length; i++) {
        tem = arr[i]
        for(let j=i; j>=0; j--){
            if(arr[j-1] > tem){
                arr[j] = arr[j-1]
            }else {
                arr[j] = tem
                break
            }
        }
    }
    return arr
}

快速排序

function quickSort (arr) {
    let len=arr.length,left=[],right=[],current = arr[0];
    if(len<=1) return arr;
    for(let i=1; i<len; i++){
        if(arr[i]<current) {
            left.push(arr[i]);
        } else {
            right.push(arr[i])
        }   
    }
    // 递归步骤1,2
    return quickSort(left).concat(current, quickSort(right))
}

选择排序

/**
 * 先假设第一个元素为最小的,然后通过循环找出最小元素,
 * 然后同第一个元素交换,接着假设第二个元素,重复上述操作即可
 */
function selectSort(arr) {
    let len = arr.length, minIndex, tem
    for(let i=0; i<len-1; i++) {
        minIndex = i //最小值下标
        for(let j=i+1; j<len; j++) {
            if(arr[j] < arr[minIndex]){
                // 找出最小值
                minIndex = j //更换最小值下标
            }
        }
        // 交换位置
        tem = arr[i]
        arr[i] = arr[minIndex]
        arr[minIndex] = tem
    }
    return arr
}

归并排序

// 将数组一直等分,然后合并
function merge(left, right) {
    let tem = [];
    while(left.length && right.length) {
        if(left[0] < right[0]) {
            tem.push(left.shift());
        }else{
            tem.push(right.shift());
        }
    }
    return tem.concat(left,right);
}
function mergeSort(arr) {
    const len = arr.length;
    if(len<2) return arr;
    let mid = Math.floor(len / 2), left = arr.slice(0,mid), right = arr.slice(mid);
    return merge(mergeSort(left),mergeSort(right));
}

希尔排序

function shellSort(arr) {
    var len = arr.length;
    for(var gap = Math.floor(len / 2); gap > 0; gap = Math.floor(gap / 2)) {
        for(var i = gap; i < len;i++) {
            var j = i;
            var current = arr[i];
            while (j - gap >= 0 && current < arr[j - gap]) {
                 arr[j] = arr[j - gap];
                 j = j - gap;
            }
            arr[j] = current;
        }
    }
    return arr;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 冒泡排序 我们先来了解一下冒泡排序算法,它是最慢的排序算法之一,但也是一种最容易实现的排序算法。之所以叫冒泡排序是...
    邵志远阅读 812评论 0 0
  • 前言 说到算法,就不得不说一下排序了,相信很多人的算法是从排序开始的,哪怕是算法导论这本书,也是从排序开始讲的算法...
    tianyl阅读 282评论 0 0
  • 一、直接插入排序 直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的元素记录,按其关键字...
    kevin16929阅读 591评论 0 0
  • 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序...
    jiangliang阅读 1,432评论 0 1
  • 常见比较排序1.冒泡排序2.选择排序:简单选择排序和堆排序3.插入排序:直接插入排序和希尔排序4.快速排序5.归并...
    Adonia汪阅读 243评论 0 0