八大算法的原理及实现(JS版本待更新)

https://blog.csdn.net/a3192048/article/details/80269862
在这里插入图片描述

  1. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序或并归排序。
  2. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的时间最短。
  3. 算法效率比较
    在这里插入图片描述

1. 插入排序—直接插入排序

基本思想:
将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。
要点:设立哨兵,作为临时存储和判断数组边界之用。
直接插入排序示例:
在这里插入图片描述
如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。

算法实现

    function insertSort(arr) {
      console.log("原始数组:" + arr);
      var lens = arr.length;
      for(let i=1;i<lens;i++) {
        for(let j=0;j<i;j++) { //与前面的i项序列进行排序
          if(arr[i] < arr[j]) { //比原始项小则插入到之前
            arr.splice(j,0,arr[i]); 
            arr.splice(i+1,1); //将原始项删除
            break 
          } 
        }
        console.log("第" + i + "次: " + arr);
      }
    }

其中关于splice的用法:

  1. 使用 splice() 来删除元素
    通过参数设定,您能够使用 splice() 在数组中不留“空洞”的情况下移除元素。
    第一个参数(0)定义新元素应该被添加(接入)的位置。
    第二个参数(1)定义应该删除多个元素。
    其余参数被省略。没有新元素将被添加
  2. 第一个参数(2)定义了应添加新元素的位置(拼接)。
    第二个参数(0)定义应删除多少元素。
    其余参数(“第三个参数”,“第四个参数” …)定义要添加的新元素。

测试案例

    var arr = [49, 38, 65, 97, 76, 13, 27, 49];
    insertSort(arr);

结果输出
在这里插入图片描述

交换排序——快速排序

基本思想:

  • 选择一个基准元素,通常选择第一个元素或者最后一个元素,
  • 通过一趟排序,将待排序的记录分割成独立的两个部分,其中一部分记录的元素值均比基准元素值小。另一部分的记录的元素值都比基准值大。
  • 此时基准元素在排好序的正确位置
  • 然后分别对这两部分记录用同样的方法进行排序,直到整个序列都有序

快速排序实例:

在这里插入图片描述
过程如下:
在这里插入图片描述

  • 实现方法——挖坑法
function QuickSort(arr) {
            if(arr.length < 2) {
                return arr;
            } else {
                var pivotkey = arr[0]; //将pivotkey提取出来

                var j = arr.length-1
                var i = 0;
                while(i < j) {
                    if(arr[j] < pivotkey) { //先从左边往右边遍历,找到第一个小于pivotkey的值
                        arr[i] = arr[j]; 
                        for(i=i+1; i<j; i++) {//从又往左找第一个大于pivotkey的值
                            if(arr[i] > pivotkey) {
                                arr[j] = arr[i];
                                break
                            }
                        }
                    } else {
                        j--;
                    }       
                }
                arr[i] = pivotkey;
            }
            var left = QuickSort(arr.slice(0,i));
            var right = QuickSort(arr.slice(i+1,arr.length));
            left.push(pivotkey);
            return left.concat(right)
        }
        const arr = [49, 43, 65, 97, 76, 13, 27];
        console.log(QuickSort(arr));//[13, 27, 43, 49, 65, 76, 97]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值