为了账号安全,请及时绑定邮箱和手机立即绑定

常用算法总结

2018.11.01 13:09 2489浏览

算法是什么

算法之于程序,是质变的过程(其实就是1分钟变1秒钟的差距)
程序 = 算法 + 数据结构
现在火热的AI技术,也并不是突然出现的,也是靠着之前积累的各种算法组合试验去运行的。
算法如同机器人的大脑,告诉机器人如何行动,思考等一系列行为。

废话少说直接给大家上干货吧

首先是冒泡排序,说到冒泡 在大学学过C语言的应该很熟悉吧

冒泡排序的思想

  • 从数组的第一项开始于相邻元素进行比较,如果相邻元素比自己 小就与之调换位置并继续比较直到没有相邻元素与之比较
  • 下面 这张图很清楚的描述了冒泡排序的过程
  • 图片描述

废话少说 下面开始撸代码

function arraylist(){
    let arr = []
    //将数据插入的数组中
    this.insert=(item)=>{
       arr.push(item)
    }
    //将数组显示出来
    this.show= ()=>{
        return arr.join('-')
    }
    //冒泡排序
    this.bubble = ()=>
    {
        let len = arr.length
        for(let i =0; i < len ; i++)
        {
             //这里的-i 是由于外层跑过一轮的就没必要在比较了
            for(let j =0; j < len-1-i;j++){
                if(arr[j] > arr[j+1]){
                //采用Es6 中的结构赋值来实现第j项以及第j+1项的位置
                //调换
                    [arr[j],arr[j+1]] = [arr[j+1],arr[j]] 
                }
            }
        }
    }
}
let arr = [52673]
let crealit= (arr)=>{
    let list = new arraylist()
    arr.forEach(element => {
        list.insert(element)
    });
    return list
}
let item = crealit(arr)
console.log(item.show())// 5-2-6-7-3
item.bubble()
console.log(item.show()) //2-3-5-6-7

是不是很简单接下,冒泡排序并不是最优的排序方法,接下来接着来学习下 选择排序 吧

选择排序

选择排序就是在数组中 选择一个标杆 然后遍历数组如果存在比它还小的就调换位置
模型图
图片描述

来解释下模型图模型图里主要包括了第一轮懂了其他的也同理

首先最小的标杆标记为min =0 ,然后于 第一项4进行比较发现比4大则把min标记改为1,以此类推找到min=4,时候在往后找发现最后一项为6>2 则min=4的标记不变 一轮比较结束 后交换 0 ,4 索引对应的值 也就是 8 于2 互换 ,接着第二轮也一样 min =1 开始原理也是一样的

大白话整起来感觉都不习惯了 大佬勿 喷

废话不多说直接撸代码如下

function arrlist(){
    let arr = []
    //将数据插入的数组中
    this.insert=(item)=>{
       arr.push(item)
    }
    this.show= ()=>{
        return arr.join('-')
    }
    this.select = function(){
      let len = arr.length
      let min;//定义标杆的索引
      for(let i =0;i< len-1;i ++){
          min = i //默认第一项为最小标杆
          for (let j =i+1; j < len;j++ ) {
          // 如果纯在比标签还小就把标杆的索引换成j
              if(arr[min] > arr[j]){
                  min = j 
              }
          }
          //一轮下来如果i于min 不等说明 min对应的标杆不是最小
           if(i != min){
              [arr[i],arr[min]] = [arr[min],arr[i]]
          }     
        }
    }
}
let arr = [8,4,3,5,2,6]
let crealit= (arr)=>{
    let list = new arrlist()
    arr.forEach(element => {
        list.insert(element)
    });
    return list
}
let item = crealit(arr)
console.log(item.show())//8-4-3-5-2-6
item.select()
console.log(item.show()) //2-3-4-5-6-8

好了到这里 两种算法结束了 都套路两成循环都不是最优的 接下来再来看下插入排序,努力吧骚年 ?

插入排序

原理
插入排序算法是假定数组的第一项已经是排好序的了,直接用它和第二项去比较,如果比第二项大就将索引和值都进行交换,以此来推来实现排序

废话不说先找个模型出来
图片描述

接下来直接撸代码

function select(arr){
    //接受个数组
    let len = arr.length
    //定义tmp接收将要插入的元素
    //index 接收索引
    let tmp ;
    let index;
    for(let i =1 ; i < len ; i++){
    //默认第一项已经排好序从第二项开始 
        index = i;
        tmp = arr[index]
        //如果tmp 比前一项的值小 则把前一项(index-1)放到(index)
        //位置
        while(index > 0 &&(arr[index-1]>tmp)){
            arr[index] = arr[index-1]
            index --
        }
        //如果前一项的值比tmp小则把tmp(参与排序的一项)
        //放到arr[index]位置
        arr[index] = tmp
    }
    return arr
}
let arr = [3,6,4,2,11,10,5]

console.log(select(arr))//[ 2, 3, 4, 5, 6, 10, 11 ]

是不是都会了

其实 最厉害都在后面 接下来是 归并排序

归并排序

归并排序的思想其实很简单就是大事 化小 小事化了;

首先使用的是递归思想 ,先把 数组 分割成 只有一个元素 后进行两个数组的比较 合并 成 一个数组

先放个模型图
图片描述

直接撸代码如下

 function ccaifen(arr){  
   //当数组的长度为一的时候就不需要再拆分了 直接返回数组 
    if (arr.length === 1){
        return arr;
    }
    //数组的长度不是一的时候接着拆分
  let len = arr.length
   let mid = Math.floor(len / 2)
   let left =  arr.slice(0,mid)
   let right = arr.slice(mid,len)
    return weare(ccaifen(left),ccaifen(right))
  } 
  //给weare传入两个数组进行比较
  function weare(left,right){
  //定义一个空数组最后将两个数组链接后放到空数组中最后将其返回出去
       let res = []
       let len = left.length
       let ren = right.length
       let l = 0;
       let r = 0;
       
      while((l<len) && (r < ren)){
        // 如果左边的数组 比较小直接放到res中
        //否则是右边的的数组放到 res中
          if(left[l] < right[r]){
            res.push(left[l++])
          }else{
              res.push(right[r++])
          }
      }
      //下面的两个while主要是将剩下的数组中的元素添加到 res中
      //最后return res 将数组返回出去
      while(l < len){
          res.push(left[l++])
      }
     while(r < ren){
         res.push(right[r++])
     }
     return res
  }

  let arr = [5,9,4,7,3,5,78,0,8,9,5,6,7,88]
  console.log(ccaifen(arr))//[ 0, 3, 4, 5, 5, 5, 6, 7, 7, 8, 9, 9, 78, 88 ]

稍微有点难懂
不懂的小伙伴 可以在浏览器打断点看的运行逻辑

点击查看更多内容

本文原创发布于慕课网 ,转载请注明出处,谢谢合作

11人点赞

若觉得本文不错,就分享一下吧!

评论

相关文章推荐

正在加载中
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消