资讯专栏INFORMATION COLUMN

常见前端排序方式对比

godlong_X / 316人阅读

摘要:首先需要一个自动生成数组的函数自动生成数组的函数执行上面函数,的到的数组长度为,因为执行速度很快,只有长度很大时,才能看到各个方法的执行速度的差别注意到不能简单的用赋值,否则改变后,到也相应改变了六个相同的数组并且数组长度要足够大才能对比出

首先需要一个自动生成数组的函数
    // 自动生成数组的函数
    function randomArr (n) {
        let arr = [];
        for (let i = 1; i <= n; i++) {
            arr.push(Math.floor(Math.random() * (i + 1)));
        }
        return arr;
    }

执行上面函数,的到的arr1数组长度为50000,因为js执行速度很快,只有长度很大时,才能看到各个方法的执行速度的差别

注意 arr2到arr6不能简单的用赋值,否则arr1改变后,arr2到arr6也相应改变了

    
    // 六个相同的数组 并且数组长度要足够大才能对比出来
    let arr1 = randomArr(50000);
    let arr2 = [...arr1];
    let arr3 = [...arr1];
    let arr4 = [...arr1];
    let arr5 = [...arr1];
    let arr6 = [...arr1];
接下来是我们常见的排序方式
    // 选择排序
    function pickSort (arr) {
        let temp;
        for (let i = 0; i < arr.length; i++) {
            for (let j = i + 1; j < arr.length; j++) {
                if (arr[i] > arr[j]) {
                    temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        return arr;
    }

    // 冒泡排序
    function bubleSort (arr) {
        let temp, isSort;
        for (let i = 1; i < arr.length; i++) {
            isSort = false;
            for (let j = 0; j < arr.length - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    isSort = true;
                }
            }
            if (!isSort) {
                break;
            }
        }
        return arr;
    }

    // 快速排序 快速排序方法同时也是递归
    function quickSort (arr) {
        if (arr.length <= 1) {
            return arr;
        }
        let x = arr.splice(0, 1)[0];
        let left = [], right = [];
        for (let i = 0; i < arr.length; i++) {
            if (arr[i] < x) {
                left.push(arr[i]);
            } else {
                right.push(arr[i]);
            }
        }
        return quickSort(left).concat([x]).concat(quickSort(right));
    }

    // 插入排序
    function spliceSort (arr) {
        let temp;
        for (let i = 1; i < arr.length; i++) {
            for (let j = i; j > 0; j--) {
                if (arr[j] < arr[j - 1]) {
                    temp = arr[j];
                    arr[j] = arr[j - 1];
                    arr[j - 1] = temp;
                } else {
                    break
                }
            }
        }
        return arr;
    }

    // 希尔排序
    function shellSort (arr) {
        let temp;
        let gap = 1;
        while (gap < arr.length) {
            gap = 3 * gap + 1;
        }
        for (; gap > 0; gap = Math.floor(gap / 3)) {
            for (let i = gap; i < arr.length; i ++) {
                for (let j = i; j > 0; j -= gap) {
                    if (arr[j] < arr[j - gap]) {
                        temp = arr[j];
                        arr[j] = arr[j - gap];
                        arr[j - gap] = temp;
                    } else {
                        break
                    }
                }
            }
        }
        return arr;
    }
计算各个方法所花费的时间

最后,需要一个函数调用以上各种排序的方法,并进行时间计算

    // 计算排序时间的函数
    function calcTime (arr, fun) {
        console.time(fun.name);
        let newArr = fun(arr);
        console.timeEnd(fun.name);
    }
    
    // 开始计算
    calcTime(arr1,bubleSort);
    calcTime(arr2,quickSort);
    calcTime(arr3,pickSort);
    calcTime(arr4,spliceSort);
    calcTime(arr5,shellSort);
Array.protype.sort是js自带排序函数,也可以测试一下速度
    // 看下array.prototype中排序的效率如何
    console.time("Array.prototype.sort");
    arr6.sort(function (a,b) {
        return a-b;
    });
    console.timeEnd("Array.prototype.sort");
计算结果来了

bubleSort: 6846.92724609375ms
quickSort: 342.636962890625ms
pickSort: 5732.3818359375ms
spliceSort: 859.482177734375ms
shellSort: 58.785888671875ms
Array.prototype.sort: 69.878173828125ms

小结

希尔排序 > Array.prototype.sort > 快速排序 > 插入排序 > 选择排序 > 冒泡排序

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/97825.html

相关文章

  • 初级前端开发面试总结

    摘要:前端面试总结先说背景,本人年月毕业,去年十月校招到今年月一直在做前端开发工作,年前打算换工作,就重新梳理下面试考点总结包含基础,基础,常见算法和数据结构,框架,计算机网络相关知识,可能有的点很细,有的点很大,参考个人情况进行总结,方便对知识 前端面试总结 先说背景,本人2018年7月毕业,去年十月校招到今年10月一直在做前端开发工作,年前打算换工作,就重新梳理下面试考点总结包含: ...

    jifei 评论0 收藏0
  • 初级前端开发面试总结

    摘要:前端面试总结先说背景,本人年月毕业,去年十月校招到今年月一直在做前端开发工作,年前打算换工作,就重新梳理下面试考点总结包含基础,基础,常见算法和数据结构,框架,计算机网络相关知识,可能有的点很细,有的点很大,参考个人情况进行总结,方便对知识 前端面试总结 先说背景,本人2018年7月毕业,去年十月校招到今年10月一直在做前端开发工作,年前打算换工作,就重新梳理下面试考点总结包含: ...

    tigerZH 评论0 收藏0
  • 前端之多种排序方式

    摘要:前言排序是编程中很基础却很有学问的算法。常见的内部排序算法有插入排序希尔排序选择排序冒泡排序归并排序快速排序堆排序基数排序等。本文主要阐述前端面试中最常问的三种排序冒泡排序选择排序,其他排序方法详情点我。冒泡排序算法描述比较相邻的元素。 前言 排序是编程中很基础却很有学问的算法。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。本文主...

    ShevaKuilin 评论0 收藏0
  • 深度剖析:如何实现一个 Virtual DOM 算法

    摘要:本文所实现的完整代码存放在。这就是所谓的算法。两个树的完全的算法是一个时间复杂度为的问题。如果有差异的话就记录到一个对象里面。如和的不同,会被所替代。这牵涉到两个列表的对比算法,需要另外起一个小节来讨论。 作者:戴嘉华 转载请注明出处并保留原文链接( https://github.com/livoras/blog/issues/13 )和作者信息。 目录: 1 前言 2 对前端应用状...

    vvpvvp 评论0 收藏0
  • 博客 - 收藏集 - 掘金

    摘要:技术之类加载机制掘金类加载机制是语言的一大亮点,使得类可以被动态加载到虚拟机中。玩转仿探探卡片式滑动效果掘金讲起本篇博客的历史起源,估计有一段历史了。 Java 技术之类加载机制 - Android - 掘金类加载机制是 Java 语言的一大亮点,使得 Java 类可以被动态加载到 Java 虚拟机中。 这次我们抛开术语和概念,从例子入手,由浅入深地讲解 Java 的类加载机制。 本文...

    Shimmer 评论0 收藏0

发表评论

0条评论

godlong_X

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<