资讯专栏INFORMATION COLUMN

使用JavaScript实现部分算法

sshe / 1297人阅读

摘要:二分查找二分查找是一种在有序列表中查找某一特定元素的搜索算法。如果出现列表为空,则表示找不到该元素。这种搜索算法每一次比较都使搜索范围缩小一半,时间复杂度为。

二分查找

二分查找是一种在有序列表中查找某一特定元素的搜索算法。从列表的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在列表大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果出现列表为空,则表示找不到该元素。这种搜索算法每一次比较都使搜索范围缩小一半,时间复杂度为Ο(logn) 。

"use strict"
function binarySearch(orderedArr, start, end, value) {
  if (start > end) {
    return -1;
  }
  const middle = Math.floor((start + end) / 2);
  const middleVal = orderedArr[middle];
  let newStart = start;
  let newEnd = end;
  if (middleVal > value) {
    newEnd = middle - 1;
  } else if ( middleVal < value) {
    newStart = middle + 1;
  } else {
    return middle;
  }
  return binarySearch(orderedArr, newStart, newEnd, value);
}

function find(arr, value){
  return binarySearch(arr, 0, arr.length - 1, value);
}
快速排序
"use strict"
/**
 * (1)
 */
function quickSort(arr) {
  if (arr.length <= 1) return arr;
  const pivotIndex = Math.floor(arr.length / 2);
  const pivot = arr.splice(pivotIndex, 1)[0];
  const leftArr = [];
  const rightArr = [];
  for(let i = 0, len = arr.length; i < len; i++) {
    const item = arr[i];
    if (item > pivot) {
      rightArr.push(item);
    } else {
      leftArr.push(item);
    }
  }
  return quickSort(leftArr).concat([pivot], quickSort(rightArr));
}
"use strict"
/**
 * (2)
 */
function quickSort(arr, start, end) {
  if (start > end) return;
  const pivot = arr[end];
  let position = start;
  for (let i = start; i < end; i++) {
    if (arr[i] < pivot ) {
      [arr[position], arr[i]] = [arr[i], arr[position]]; // swap
      position++;
    }
  }
  [arr[position], arr[end]] = [arr[end], arr[position]];
  quickSort(arr, start, position - 1);
  quickSort(arr, position + 1, end);
}
function sort(arr) { 
  return quickSort(arr, 0, arr.length - 1);
}
冒泡排序
"use strict"
function bubbleSort(arr) {
  if (arr.length <=1 ) return arr;
  const len = arr.length;
  for (let i = 0; i < len; i++) {
    for (let j = i+1; j < len; j++) {
      if (arr[i] < arr[j]) {
        [arr[i], arr[j]] = [arr[j], arr[i]];
      }
    }
  }
  return arr;
}
归并排序

先拆分再合并

"use strict"
/**
 * 递归方式(可能栈溢出)
 */

function merge(leftArr, rightArr) { // 合并
   const newArr = [];
   while (leftArr.length > 0 && rightArr.length > 0) {
       if (leftArr[0] < rightArr[0]) {
           newArr.push(leftArr.shift());
       } else {
           newArr.push(rightArr.shift());
       }
   }
   return newArr.concat(leftArr).concat(rightArr);
}

function mergeSort(arr) { // 拆分
   if (arr.length <= 1) return arr;
   const middle = Math.floor(arr.length / 2);
   const leftArr = arr.slice(0, middle);
   const rightArr = arr.slice(middle);
   return merge(mergeSort(leftArr), mergeSort(rightArr));
}
选择排序

选择排序和冒泡排序很相近,不多次反复交换,是找到最大或最小的元素的位置,再做交换

"use strict"
function selectSort(arr) {
  if (arr.length <= 1) return arr;
  const len = arr.length;
  for (let i = 0; i < len; i++) {
    let tempIndex = i;
    for (let j = i + 1; j < len; j++) {
      if (arr[j] < arr[tempIndex]) {
        tempIndex = j;
      }
    }
    [arr[i], arr[tempIndex]]=[arr[tempIndex], arr[i]];
  }
  return arr;
}
插入排序
"use strict"
function insertSort(arr) {
  if (arr.length <= 1) return arr;
  const len = arr.length;
  let preIndex, current;
  for (let i = 1; i < len; i++) {
    preIndex = i - 1;
    current = arr[i];
    while (preIndex >= 0 && arr[preIndex] > current) {
      arr[preIndex+1] = arr[preIndex];
      preIndex--;
    }
    arr[preIndex+1] = current;
  }
  return arr;
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/81278.html

相关文章

  • 深入浅出 JavaScript 的 Array.prototype.sort 排序算法

    摘要:快速排序是不稳定的排序算法。浏览器的实现不同有什么影响排序算法不稳定有什么影响举个例子某市的机动车牌照拍卖系统,最终中标的规则为按价格进行倒排序相同价格则按照竞标顺位即价格提交时间进行正排序。 本文要解决的问题 1、找出 Array.prototype.sort 使用的什么排序算法 2、用一种直观的方式展示 Array.prototype.sort 的时间复杂度,看看它有多快? 3、...

    itvincent 评论0 收藏0
  • JavaScript设计模式与开发实践 - 策略模式

    摘要:引言本文摘自设计模式与开发实践在现实中,很多时候也有多种途径到达同一个目的地。将不变的部分和变化的部分隔开是每个设计模式的主题,策略模式也不例外,策略模式的目的就是将算法的使用与算法的实现分离开来。一个基于策略模式的程序至少由两部分组成。 引言 本文摘自《JavaScript设计模式与开发实践》 在现实中,很多时候也有多种途径到达同一个目的地。比如我们要去某个地方旅游,可以根据具体的实...

    xi4oh4o 评论0 收藏0
  • 道格拉斯-普克 抽稀算法javascript实现

    摘要:道格拉斯普克抽稀算法,是用来对大量冗余的图形数据点进行压缩以提取必要的数据点。经道格拉斯普克法压缩后得到的图形如图所示。但道格拉斯普克法较垂距法复杂且通常编程实现时需要采用递归方有一定的难度。 道格拉斯-普克抽稀算法,是用来对大量冗余的图形数据点进行压缩以提取必要的数据点。该算法实现抽稀的过程是:先将一条曲线首尾点虚连一条直线,求其余各点到该直线的距离,取其最大者与规定的临界值相比较,...

    CNZPH 评论0 收藏0
  • 前端开发周报: CSS 布局方式与JavaScript数据结构和算法

    摘要:如果没有学习过计算机科学的程序员,当我们在处理一些问题时,比较熟悉的数据结构就是数组,数组无疑是一个很好的选择。 showImg(https://segmentfault.com/img/bVTSjt?w=400&h=300); 1、常见 CSS 布局方式详见: 一些常见的 CSS 布局方式梳理,涉及 Flex 布局、Grid 布局、圣杯布局、双飞翼布局等。http://cherryb...

    huhud 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<