js常见排序算法实现

1.冒泡排序

原理:对数组进行遍历,根据相邻两个元素大小进行交换,每一次遍历都将最小值推至最前方,然后对剩下的值再次进行比较

时间复杂度:O(n^2)

空间复杂度:O(1)

稳定性:稳定

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

2.快速排序

原理:从数组中取一个基准值,将剩下的值与基准值比较,小于的放到左边,大于的放到右边,并对左右两边进行快速排序,重复直到左右两边只剩一个元素,最后合并

平均时间复杂度O(nlogn)

最坏时间复杂度:O(n^2)

空间复杂度:O(nlogn)

稳定性:不稳定

// 快速排序
function quickSort(arr) {
    let len = arr.length
    if (len < 2) {
        return arr;
    }
    let index = Math.floor(len / 2);
    let pindex = arr.splice(index, 1)[0]; // 去除基准值
    let left = [], right = [];
    arr.forEach(item => {
        if (item > pindex) {
            right.push(item);
        } else {
            left.push(item);
        }
    })
    return quickSort(left).concat([pindex], quickSort(right))
}

3.插入排序

原理:将数组分成两个,一个是已排序,一个是待排序,将待排序中的元素与已排序的元素进行比较并插入到适当位置

最好时间复杂度:O(n),当数组已经由小到大排序好

最坏时间复杂度:O(n^2),当数组是由大到小排序,与冒泡排序相同

空间复杂度:O(1)

稳定性:稳定

// 插入排序
function insertSort(arr) {
    let len = arr.length;
    let prev, cur;
    for (let i = 1; i < len; i++) {
        prev = i - 1;
        cur = arr[i];
        while(prev >= 0 && arr[prev] > cur) {
            arr[prev + 1] = arr[prev];
            prev--;
        }
        arr[prev + 1] = cur;
    }
    return arr;
}

4.希尔排序

原理:将整个数组通过设置步长分为一个个分块,对每个分块进行序列化,最后进行一次插入排序

时间复杂度:O(nlogn)~O(n²),一般为O(n^1.5),数组有序程度越高,排序越快

空间复杂度:O(1)

稳定性:不稳定

// 希尔排序
function shellSort(arr) {
    let len = arr.length;
    let tmp;
    let gap = Math.floor(len / 2);
    while(gap > 0) {
        for (let i = gap; i <len; i++) {
            for (let j = i; j >= gap && arr[j] < arr[j - gap]; j -= gap) {
                tmp = arr[j];
                arr[j] = arr[j - gap];
                arr[j - gap] = tmp;
            }
        }
        gap = Math.floor(gap / 2);
    }
    return arr;
}

5.选择排序

原理:从数组第一个元素开始,与后面所有元素进行比较,如果有比其小的值,则交换两者位置

时间复杂度:O(n^2)

空间复杂度:O(1)

稳定性:不稳定

// 选择排序
function selectSort(arr) {
    let len = arr.length;
    let index, tmp;
    for (let i = 0; i < len; i++) {
        index = i;
        for (let j = i + 1; j < len; j++) {
            if (arr[index] > arr[j]) {
                index = j;
            }
        }
        tmp = arr[index];
        arr[index] = arr[i]
        arr[i] = tmp
    }
    return arr
}

6.归并排序

原理:将数组拆分成短序列进行排序,然后把各个有序的短序列合并成一个

时间复杂度:O(nlogn)

空间复杂度:O(1)

稳定性:稳定

// 归并排序
function mergeSort(arr) {
    if (arr.length < 2) {
        return arr;
    }
    let mid = Math.floor(arr.length / 2);
    let left = arr.slice(0, mid);
    let right = arr.slice(mid);

    return merge(mergeSort(left), mergeSort(right));
}

function merge(left, right) {
    console.log(right);
    let arr = [];
    while(left.length && right.length) {
        if (left[0] <= right[0]) {
            arr.push(left.shift());
        } else {
            arr.push(right.shift());
        }
    }

    while(left.length) {
        arr.push(left.shift());
    }
    while(right.length) {
        arr.push(right.shift());
    }
    return arr
}
(0)

相关推荐

  • 七大经典、常用排序算法的原理、Java 实现以及算法分析

    0. 前言 大家好,我是多选参数的程序锅,一个正在 neng 操作系统.学数据结构和算法以及 Java 的硬核菜鸡.数据结构和算法是我准备新开的坑,主要是因为自己在这块确实很弱,需要大补(残废了一般) ...

  • 35.数组.选择排序

    选择排序: 第一轮: 第0个与第1个比, 如果  第0个 > 第1个  那就交换位置,第0个再与第2个比...... 第二轮: 第1个与第2比, ...................直到排序完 ...

  • 面试官在“逗”你系列:数组去重你会几种呀?

    前言 数组去重是一个老生常谈的话题,也是前端童鞋在面试时的一道高频题.本文将深入的探索数组去重的原理及实现,为各位小伙伴提供多种可以反手"调戏"面试官的解决方案. 话不多说,上去就 ...

  • 图解七大排序算法

    "排序是计算机的核心内容.事实上,从很多方面看,如果没有排序,计算机就不会变成现实." <算法之美:指导工作与生活的算法> 排序算法,或许是我们日常最常见也是使用频率最 ...

  • PHP数据结构-插入类排序:简单插入、希尔排序

    插入类排序:简单插入.希尔排序 总算进入我们的排序相关算法的学习了.相信不管是系统学习过的还是没有系统学习过算法的朋友都会听说过许多非常出名的排序算法,当然,我们今天入门的内容并不是直接先从最常见的那 ...

  • 排序算法之希尔排序及其增量序列

    希尔排序 其他排序方法:选择排序.冒泡排序.归并排序.快速排序.插入排序.希尔排序.堆排序 思想 希尔排序大概就是,选一组递减的整数作为增量序列.最小的增量必须为1:DM>DM−1>... ...

  • 常见排序算法效率比较

    常见排序算法效率比较

  • 信息学竞赛基础算法-常见排序算法总结

    摘要 排序是一种重要的数据处理方式,在应用数据前往往需要将数据进行排序.同时,排序也是很多重要算法的组成部分,在诸如搜索,动态规划等过程中也发挥着关键作用.在信息学奥赛中,排序算法同样必不可少.更优的 ...

  • 常见的排序算法总结

    排序的概念 1.排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 2.稳定性:假定在待排序的记录序列中,存在多个具有相同关键字的记录,若经过排序,这些记录 ...

  • Python中几种常见的排序算法?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  • 【漫画】七种最常见的排序算法(动图版)

    https://blog.csdn.net/qq_32799165/article/details/87878876 漫画由小猿编写创作 一.冒泡排序 冒泡排序是排序算法中较为简单的一种,英文称为 B ...

  • 十种排序算法总结(冒泡、插入、选择、希尔、归并、堆、快速,计数,桶,基数)

    #include<iostream> using  namespace std; void swap1( int *left,  int *right) {      int temp = ...

  • 七大排序算法总结

    以下所有动图均来源于一像素博客园 以下代码均使用C 编写 完整代码请到这里下载 稳定排序算法:冒泡排序.插入排序.归并排序 时间复杂度不受数据影响:选择排序.归并排序.堆排序 时间复杂度基本小于n2: ...

  • Java排序算法(四)希尔排序2

    希尔排序移步法:分组+直接插入排序组合 一.测试类SortTest import java.util.Arrays; public class SortTest { private static fi ...