博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
常见前端排序方式对比
阅读量:6418 次
发布时间:2019-06-23

本文共 3668 字,大约阅读时间需要 12 分钟。

首先需要一个自动生成数组的函数

// 自动生成数组的函数    function randomArr (n) {        let arr = [];        for (let i = 1; i <= n; i++) {            arr.push(Math.floor(Math.random() * (i + 1)));        }        return arr;    }
  1. 执行上面函数,的到的arr1数组长度为50000,因为js执行速度很快,只有长度很大时,才能看到各个方法的执行速度的差别
  2. 注意 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 > 快速排序 > 插入排序 > 选择排序 > 冒泡排序

转载地址:http://iqpra.baihongyu.com/

你可能感兴趣的文章
Android 图片相关整理
查看>>
OC内存管理(ARC)--多对象内存管理
查看>>
Spring实战 (二) Spring2.5/3.0新特性及XML配置文件命名空间介绍
查看>>
创建一个Hello World(React),组件的作用
查看>>
java中的context
查看>>
进程和线程的区别和联系
查看>>
排队论---单服务台负指数分布排队系统的分析
查看>>
Spring源码阅读——3
查看>>
golang调用dll
查看>>
使用ZXing生成可供手机识别的二维码
查看>>
【原创】modb 开发之需求和总体设计
查看>>
幸福是什么?
查看>>
Android开发PX与DIP的清晰解释[魔豆之路]
查看>>
mysql explain type连接类型示例
查看>>
memcache源码安装
查看>>
1.10494 - If We Were a Child Again
查看>>
统计文件中不小于某一长度的单词的个数(泛型算法实现)
查看>>
Android Fragment 真正的完全解析(上)
查看>>
常见缓存算法和缓存策略
查看>>
pg_dump 不用输入密码进入数据库
查看>>