js常用算法

对数

如果a^x=N(a>0,且a≠1),则x叫做以a为底N的对数,记做x=log(a)(N),其中a要写于log右下。其中a叫做对数的底,N叫做真数 。通常我们将以10为底的对数叫做常用对数,以e为底的对数称为自然对数。

「基本知识」

image

时间复杂度

通常我们会用大O来表示一个算法的时间复杂度,即 某个算法的时间增量。

例如: 要在 一个 5个元素的数组中 查找 1个数 , 不管从第几个元素开始查找 要想 找到这个数 ,最多需要 5次查找操作 ,最少需要1次 如果是 6个元素的数组,要找到这个数 则 最多 6次 ,最少1次。 通过 大O表示 时间复杂度就是 O(n), 即 每增加 n个元素 就需要 多查找n次 ,算法的时间增量就是o(n).通常大O表示算法复杂度增量 都是以 最坏的 情况为 准。

简单查找

在一个数组中挨个查找某个数据,这种查找就是简单查找

比如 5个元素的数组中 查找 1个数 ,从头到尾查找,最多需要查找五次。

「时间复杂度」:O(n) , 算法时间是线性增长的。 n个数 最多查找n次 最少查找1次。

「例子」

   * 简单查找
   * @param arr 目标数组
   * @param num 要查找的数字
   */
  function simpleSearch(arr: number[], num: number):number {
    for (let one of arr) {
      if (one === num) {
        return one;
      }
    }
    return -1;
  }

二分查找

「前提」:已经排序的数据

「逻辑」:在排好序(降序如 1,2,3)的 容器中 每次选择 容器的 中间或者+1或者-1的数字,进行比较,如果 该数字 大于要查找的数字 ,那么以该数字索引-1对应的值为最大元素,以原来最小的值为最小值 ,继续 折中 查找,如果 该数字 小于要查找的数字 则以 该数字索引+1所对应的值为最小值 ,原最大值为最大值 再次折中查找 ,一直到最小数索引等于最大数索引 即 找到对应的值或者 查找完 没有该值为止。

「时间复杂度」:O(log2n) 以2为底 真数为n的对数。

比如 在 n个已经排好序的数中查找某个数据,每次折中查找 ,那么找到这个数的 最多次数是 log2n 次 。如果 n是 10 那么 找到这个数 最多需要4次 即 2 * 2 * 2 * 2。因为222是 8不到10 不能完全查完容器的数据,所以还需要折中查找一次,所以是 4次

「例子」

   * arr 目标数组
   * num  要查找的数字
  */
 function binarySearch(arr: number[], num: number):number {
    let low = 0;
    let hight = arr.length - 1;
    let count = 0;
    while (low <= hight) {
      count++;
      let mid = Math.floor((low + hight) / 2);
      let guess = arr[mid];
      if (guess === num) return guess;
      if (guess > num) {
        hight = mid - 1;
      } else {
        low = mid + 1;
      }
    }
    return -1;
  }

选择排序

「逻辑」:需要遍历n-1趟,n表示容器中n个元素,每趟从待排序的记录序列中选择最小或最大的数字放到已排序表的最前位置,直到全部排完。 每趟交换一次数据

「时间复杂度」:log(n*n) 最多需要 n * n 次排完

「稳定性」:不稳定

「例子」

   * 选择排序 从小到大
   * @param arr 容器
   */
 function selectionSort(arr: number[]) {
    let len = arr.length;
    for (let i = 0; i < len - 1 ; i++) {
      //设定第一个元素为最小元素
      let minindex = i;
      for (let j = i + 1; j < len ; j++) {
        if (arr[minindex] > arr[j]) {
          minindex = j;
        }
      }
      //每次遍历找出最小值与上一次的最小值交换
      if (i != minindex) {
        let temp = arr[minindex];
        arr[minindex] = arr[i];
        arr[i] = temp;
      }

    }
  }

冒泡排序

「逻辑」:在要排序的一组数中,对当前还未排好序的范围内的全部数,对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。 需要遍历 n-1趟,每趟 需要对比 n- 当前排序索引-1 次。每趟 交换 n-当前排序索引 -1次 数据

「时间复杂度」:log(n*n) 最多需要 n * n 次排完

「稳定性」:稳定

「例子」

 * 冒泡排序 从小到大
 * @param arr 
 */
 function bubbleSort(arr: number[]) {
    let len = arr.length;
    for (let i = 0; i < len - 1; i++) {
      for (let j = 0; j < len - i - 1; j++) { // -i 是 排除已经沉到最下面的数,没必要再次比较。
        if (arr[j] > arr[j + 1]) {
          let temp = arr[j];
          arr[j] = arr[j + 1];
          arr[j + 1] = temp;
        }
      }
    }
  }

快速排序

「逻辑」

(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。

(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。

(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。

(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

「时间复杂度」:最好情况 nlog(2n),最差情况log(n*n)

「理想的情况是」:每次划分所选择的中间数恰好将当前序列几乎等分,经过log2n趟划分,便可得到长度为1的子表。这样,整个算法的时间复杂度为O(nlog2n)。

「最坏的情况是」:每次所选的中间数是当前序列中的最大或最小元素,这使得每次划分所得的子表中一个为空表,另一子表的长度为原表的长度-1。这样,长度为n的数据表的快速排序需要经过n趟划分,使得整个排序算法的时间复杂度为O(n*n)

「稳定性」:不稳定

「例子」

   * 快速排序
   * @param array 输入待排序数组
   * @returns 排序后的数组
   */
  quickSort(array:number[]) {

    const sort = (arr, left = 0, right = arr.length - 1) => {
     if (left >= right) {//如果左边的索引大于等于右边的索引说明整理完毕
      return
      }

    let low = left
    let index = right
    const baseVal = arr[right] // 取无序数组最后一个数为基准值

    while (low < index) {//把所有比基准值小的数放在左边大的数放在右边

      //找到一个比基准值大的数交换
      while (low < index && arr[low] <= baseVal) { 
        low++
      }
      arr[index] = arr[low] // 将较大的值放在右边如果没有比基准值大的数就是将自己赋值给自己(i 等于 j)

      while (low < index && arr[index] >= baseVal) { //找到一个比基准值小的数交换
        index--
        break
      }
      arr[low] = arr[index] // 将较小的值放在左边如果没有找到比基准值小的数就是将自己赋值给自己(i 等于 j)
    }

      arr[index] = baseVal // 将基准值放至中央位置完成一次循环(这时候 j 等于 i )

      sort(arr, left, index-1) // 将左边的无序数组重复上面的操作
      sort(arr, index+1, right) // 将右边的无序数组重复上面的操作
    }
    sort(array)
    return array
   }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 概述 排序是程序开发中一种非常常见的操作,指对一组任意的数据元素(或记录)经过排序操作后,将它们变成一组按关键字排...
    永远新人胜废人阅读 374评论 0 0
  • 课程布置的作业,遇事不决,度娘解决~ 一、请谈谈你对算法复杂度的理解? 算法复杂度是指算法在编写成可执行程序后,运...
    生信摆渡阅读 490评论 0 1
  • 排序的基本概念 在计算机程序开发过程中,经常需要一组数据元素(或记录)按某个关键字进行排序,排序完成的序列可用于快...
    Jack921阅读 1,421评论 1 4
  • 一、基本介绍 排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。 排...
    Patarw阅读 337评论 0 0
  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 5,083评论 0 12