一些前端该掌握的排序

粘别人的博客的部分博客放笔记里里,但是忘了是哪篇博客里😫

插入排序

// 首先将第一个元素看作一个有序的序列,从第二个元素起,逐个将元素i与已经排好的序列i~0的元素进行比较
// 如果该元素小于比较元素,则将比较元素向后移动,将改元素插入,否则就将它插在当前位置
    function insertSort (arr) {
        for (var i in arr) {
            for (var j = i - 1; j >= 0; j --) {
                if (arr[j + 1] < arr[j]) {
                    [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
                } else if (arr[j + 1] >= arr[j]) {
                    break;
                }
            }
        }
        return arr;
    }

希尔排序

a、先将要数组按某个增量d(n/2,n为要排序数的个数)分成若干组,所有距离为d的倍数的记录放在同一个组中;在各组内进行直接插入排序;
b、然后再用一个较小的增量(d/2)对它进行分组,每组再进行直接插入排序;直至增量减为1,进行直接插入排序后,整体排序完成。

function shellSort(arr){
    let n = arr.length,
        d = n;
    //第一层循环:分割增量d
    while(d > 1){
        d = Math.floor(d/2);
        //下面;两层循环是直接插入排
        for(var i = d; i < n; i++){
            //记录待比较的元素
            var temp = arr[i];
            for(var j = i - d; j >= 0 && arr[j] > temp; j = j -d){
                arr[j + d] = arr[j];
            }
            arr[j + d] = temp;
        }
    }
    return arr;
}
console.log(shellSort([1,5,3,7,2,8]));

冒泡排序

基本思想——两两比较相邻的元素,如果反序,则交换位置,直到没有反序为止。有序区在后面。
a、将序列中的相邻元素依次比较,较大的数向上冒(即交换到后面);第一轮比较结束后,序列最后一个元素是当前序列的最大值。
b、对序列当中剩下的n-1个元素再次执行步骤b,直至完成。共需要n-1轮比较。

function bubbleSort(arr) {  
    let len = arr.length;
    //共需要n-1趟排序
    for(let i = 1; i < len; i++){
        for(let j = 0; j < len - i; j++){
            if(arr[j] > arr[j + 1]){
                [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]; //解构赋值进行交换
            }
        }
    }
    return arr;
}
console.log(bubbleSort([7, 3, 4, 5, 10, 7, 8, 2,21]));

快排

(1)基本思想:快排是冒泡排序的改进版。
a、从序列当中选择一个基准数(一般选第一个数);
b、遍历数组,小于基准的放在left,大于基准的放在right;
c、递归。

function QSort(arr) {  
     //如果数组<=1,则直接返回
     if(arr.length <= 1){
         return arr;
    }
     //找基准,并把基准从原数组删除
     var pivot = arr.splice(0, 1)[0];
     //定义左右数组
     var left = [];
     var right = [];

     //比基准小的放在left,比基准大的放在right
     for(var i = 0; i < arr.length; i++){
         if(arr[i] <= pivot){
             left.push(arr[i]);
         }
         else{
             right.push(arr[i]);
         }
     }
     //递归
     return QSort(left).concat([pivot],QSort(right));
}
console.log(QSort([7,2, 3, 4, 5, 10, 7, 8, 2,21]));

最后附上经常会问到的时间复杂度情况:

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
部分按各位老大的教程(在此不一一感谢,因为引用太多人的思想及技术) 以下为从电信或者联通拿回的华为hg227或hg222刷TT-526固件的过程 一、准备软件及固件(后面附下载包) winscp.exe TFTP.exe dd-wrt_mini.bin CEF.bin tomato-227.bin 二、准备一个无线网卡 刷机过程 一、先刷入DD 1、设置本地IP为192.168.1.5,网线接通电脑与HG227的LAN1端口,hg227加电 3、运行输入ping 192.168.1.1 -t 4、用TFTP加载dd-wrt_mini.bin 5、hg227通电,出现第一个TTL=100的时候就可以点击更新固件了(设置1次就可以了) 6、TFTP出现滚动条且变成绿色说明固件上传成功,此时CMD 窗口出现TIME OUT是正常情况.稍等5分钟 二、刷新CEF 1、用无线网卡搜索网络,进入DD 2、Web进入192.168.1.1 设置DD帐号密码 3、在服务页(http://192.168.1.1/Services.asp),Secure Shell(安全外壳)栏里,启用SSHd, 保存并应用 4、运行哪里输入CMD,然后telnet 192.168.1.1,输入用户名root,密码(刚才你设置DD的那个),这里主是要测试下Telnet行不行,不行的话回头找原因 5、安装好winscp,然后进入 6、winscp界面中,右边第一个框填上路由的地址192.168.1.1,中间那行的第一个框填登录的名字(root),旁边的框填登录的密码(刚才你设置DD的那个)。在最下面的协议里点选SCP,然后点连接,会提示两次错误,都按确定就可以了连接上路由器了 7、运行哪里输入CMD,然后telnet 192.168.1.1,输入用户名root,密码(刚才你设置DD的那个),执行以下指令: dd if=/dev/mtd/3 of=/tmp/nvram.bin 这样nvram.bin保存在/tmp目录中 8、进入winscp,在右边的窗口/tmp找到刚才保存下来的nvram.bin,把这个文件拖动复制到左边的目录下 9、进入winscp,在左边的窗口找到CEF.bin和刚才保存下来的nvram.bin,把这2个文件拖动复制到右边的/tmp目录下 10、运行哪里输入CMD,然后telnet 192.168.1.1,输入用户名root,密码(刚才你设置DD的那个),执行以下指令: cd /tmp mtd write cfe.bin cfe mtd write nvram.bin nvram nvram commit reboot 11、等待重启(5分钟还不行的话,就断电重启) 三、刷入TT 有两种方法可以刷入: 第一种:用FTFP刷入TT 1、设置本地IP为192.168.1.5,网线接通电脑与HG227的LAN1端口(必须接这个,否则成功了也不知道),hg227加电. 3、运行输入ping 192.168.1.1 -t 4、用TFTP加载tomato-227.bin 5、hg227通电,出现第一个TTL=100的时候就可以点击更新固件了(设置1次就可以了) 6、TFTP出现滚动条且变成绿色说明固件上传成功,此时CMD 窗口出现TIME OUT是正常情况.稍等5分钟 7、把网线接到eth.lan4,lan3.就可以接通,输入192.168.1.1就可以进入TT 第二种:从DD刷入TT 1、再次进入192.168.1.1管理升级项>Firmware Upgrad,选择tomato-227.bin 2、等待自动完成,稍等5分钟 3、把网线接到eth.lan4,lan3.就可以接通,输入192.168.1.1就可以进入TT 本文出自第一次发帖于bbs.dualwan.cn

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值