JS实现常见的查找、排序、去重算法示例


Posted in Javascript onMay 21, 2018

本文实例讲述了JS实现常见的查找、排序、去重算法。分享给大家供大家参考,具体如下:

今天总结了下排序简单的算法

【自定义排序】

先寻找一个最小的数,然后依次那这个数和数组中其他数字比较,如果发现比这个数字小的数就把这两个数调换位置,然后再继续寻找下一个最小的数字进行下一轮比较

var arr = [31, 6, 19, 8, 2, 3];
function findMin(start, arr) {
  var iMin = arr[start];
  var iMinIndex = start;
  for (var i = start + 1; i < arr.length; i++) {
    if (arr[i] < iMin) {
      iMin = arr[i];
      iMinIndex = i;
    }
  }
  return iMinIndex;
}
function sort1(arr) {
  for (var i = 0; i < arr.length; i++) {
    var iMinIndex = findMin(i, arr);
    var car;
    car = arr[i];
    arr[i] = arr[iMinIndex];
    arr[iMinIndex] = car;
  }
  return arr;
}
document.write(sort1(arr));

【线性查找】:一个一个去查找

//不重复 有序
var arr = [0];
for (var i = 1; i < 100000; i++) {
  arr[i] = arr[i - 1] + Math.floor(Math.random() * 4 + 1);
}
function find1(n, arr) {
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] == n) {
      return true;
    }
  }
  return false;
}
//测试性能
var t1 = new Date().getTime();
for (var i = 0; i < 10000; i++) {
  var n = Math.random() * 10000;
  find2(n, 0, arr.length - 1)
}
alert(new Date().getTime() - t1);

【二分查找】:不停的分成两个部分,分部分查找

是一种万能方法,不一定是最好的,但是个保底的方法。(分治法)

***中间值 相加除以二,统一偏左,向下取整

//不重复 有序
var arr = [12, 17, 23, 34, 45, 76, 89];
function find2(n, s, e) {
  //边界处理
  if (s > e) {
    return false;
  } else if (s == e) {
    if (arr[s] == n) {
      return true;
    } else {
      return false;
    }
  }
  var c = Math.floor((s + e) / 2);
  if (arr[c] == n) {
    return true;
  } else {
    if (n < arr[c]) {
      return find2(n, s, c);
    } else {
      return find2(n, c + 1, e);
    }
  }
}
alert(find2(34, 0, arr.length - 1)); //true false

【边界处理】-----递归,一层一层往下找

//要求数组不重复有顺序\
var arr = [12, 23, 34, 45, 56, 67, 78]
function find2(n, s, e) {
  if (s > e) {
    return fasle;
  } else if (s == e) {
    if (arr[s] == e) {
      return true;
    } else {
      return false;
    }
  }
  var c = Math.floor((s + e) / 2);
  if (arr[c] == n) {
    return true;
  } else {
    if (n < arr[c]) {
      return find2(n, s, c);
    } else {
      return find2(n, c + 1, e);
    }
  }
}
alert(find2(12, arr.length + 1, 78));

应用

【查找最小值】

var arr = [12, 54, 32, 9, 5, 3, 1, 101, -100, -1000];
function findMin(s, e) {
  if (s > e) {
    return [];
  } else if (s == e) {
    return arr[s];
  } else if (s == e - 1) {
    if (arr[s] < arr[e]) {
      return arr[s];
    } else {
      return arr[e];
    }
  }
  var c = Math.floor((s + e) / 2);
  var l = findMin(s, c);
  var r = findMin(c + 1, e);
  if (l < r) {
    return l;
  } else {
    return r;
  }
}
alert(findMin(0, arr.length - 1));

【数组去重】

var arr = [1, 2, 3, 4, 5, 4, 3, 4, 5, 2, 1, 4, 2, 1, 5, 7];
function findInArr(n, arr) {
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] == n) {
      return true;
    }
  }
  return false;
}
function removeCopy(s, e) {
  if (s > e) {
    return [];
  } else if (s == e) {
    return [arr[s]];
  } else if (s == e - 1) {
    if (arr[s] == arr[e]) {
      return [arr[s]];
    } else {
      return [arr[s], arr[e]]
    }
  }
  var c = Math.floor((s + e) / 2);
  var l = removeCopy(s, c);
  var r = removeCopy(c + 1, e);
  for (var i = 0; i < r.length; i++) {
    if (!findInArr(r[i], l)) {
      l.push(r[i]);
    }
  }
  return l;
}
document.write(removeCopy(0, arr.length - 1));

【数组排序】

var arr = [34, 32, 1, 76, 55, -100, 99, 101];
function mySort(s, e) {
  //边界处理
  if (s > e) {
    return [];
  } else if (s == e) {
    return [arr[s]]
  } else if (s == e - 1) {
    if (arr[s] < arr[e]) {
      return [arr[s], arr[e]];
    } else {
      return [arr[e], arr[s]];
    }
  }
  //1.切中间值
  var c = Math.floor((s + e) / 2);
  //2.分半处理
  var l = mySort(s, c);
  var r = mySort(c + 1, e);
  var res = [];
  while (l.length > 0 || r.length > 0) {
    if (l[0] < r[0]) {
      res.push(l.shift());
    } else {
      res.push(r.shift());
    }
  }
  if (l.length == 0) {
    res = res.concat(r);
  } else if (r.length == 0) {
    res = res.concat(l);
  }
  return res;
}
//调用
document.write(mySort(0, arr.length - 1));

冒泡排序 BubbleSort

循环,每次拿出两个值,两两比较,如果下一个值比目前的小,那么交换位置

外层循环是循环取数,内层循环是两两交换比较

var arr = [ - 122, -2, 5, 6, 73, 34, 5, 2];
function BubbleSort(arr) {
  for (var i = 0; i < arr.length; i++) {
    for (var j = 0; j < arr.length - 1; j++) {
      if (arr[j] > arr[j + 1]) {
        var tmp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = tmp
      }
    }
  }
  return arr;
}
document.write(BubbleSort(arr));

【快速排序】 -------quickSort

取数组中间的数,比中间数小的房中间数左边,比中间数大的放右边,再把两遍链接起来

function quickSort(arr, s, e) {
  //边界处理 参与流程
  if (arr.length == 0) {
    return [];
  }
  var c = Math.floor((s + e) / 2);
  var arrC = arr.splice(c, 1);
  var l = [];
  var r = [];
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] < arrC) {
      l.push(arr[i]);
    } else {
      r.push(arr[i]);
    }
  }
  return quickSort(l).concat(arrC, quickSort(r));
}
var arr = [5, 5, 12, 56, 1, 67, -1, -23 - 1];
document.write(quickSort(arr, 0, arr.length - 1));

【散列】 hash 哈希 数组 ------js常用用的结构

添加

var arr = [];
arr.length = 0;
var cont = 0;
function hash_add(n) {
  var pos = n % arr.length;
  //当空间不足的时候
  if (arr[pos]) {
    while (arr[pos]) {
      cont++;
      if (arr[pos] == n) {
        return;
      } else {
        pos++;
        if (pos == arr.length) {
          pos = 0;
        }
      }
    }
    arr[pos] = n;
  } else {
    arr[pos] = n;
  }
  //空间不足的时候的扩建
  if (cont == arr.length) {
    //d等呗扩建
    var oldArr = arr;
    arr.length = oldArr.length * 2;
    arr = [];
    for (var i = 0; i < oldArr.length; i++) {
      arr.push(oldArr[i]);
      count = 0;
    }
  }
}
hash_add();
Javascript 相关文章推荐
Domino中运用jQuery读取视图内容的方法
Oct 21 Javascript
Javascript调用C#代码
Jan 17 Javascript
JS面向对象编程浅析
Aug 28 Javascript
JavaScript实现的使用键盘控制人物走动实例
Aug 27 Javascript
利用JQuery写一个简单的异步分页插件
Mar 07 Javascript
微信小程序 开发经验整理
Feb 15 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
Feb 27 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
Mar 14 Javascript
基于vue-cli创建的项目的目录结构及说明介绍
Nov 23 Javascript
移动web开发之touch事件实例详解
Jan 17 Javascript
p5.js入门教程之鼠标交互的示例
Mar 16 Javascript
js中Function引用类型常见有用的方法和属性详解
Dec 11 Javascript
vue组件jsx语法的具体使用
May 21 #Javascript
关于vue的语法规则检测报错问题的解决
May 21 #Javascript
JS实现520 表白简单代码
May 21 #Javascript
了解ESlint和其相关操作小结
May 21 #Javascript
vue2.0 实现导航守卫(路由守卫)
May 21 #Javascript
使用vue-cli(vue脚手架)快速搭建项目的方法
May 21 #Javascript
JavaScript实现一个带AI的井字棋游戏源码
May 21 #Javascript
You might like
深入理解PHP中的Session和Cookie
2013/06/21 PHP
php魔术函数__call()用法实例分析
2015/02/13 PHP
54个提高PHP程序运行效率的方法
2015/07/19 PHP
PHP中的密码加密的解决方案总结
2016/10/26 PHP
thinkphp利用模型通用数据编辑添加和删除的实例代码
2016/11/20 PHP
php解压缩zip和rar压缩包文件的方法
2019/07/10 PHP
Javascript 个人笔记(没有整理,很乱)
2007/07/07 Javascript
JavaScript 继承的实现
2009/07/09 Javascript
javascript 隔行换色函数代码
2010/10/24 Javascript
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
javascript简单性能问题及学习笔记
2014/02/04 Javascript
node.js中的path.dirname方法使用说明
2014/12/09 Javascript
JS或jQuery获取ASP.NET服务器控件ID的方法
2015/06/08 Javascript
JavaScript中style.left与offsetLeft的使用及区别详解
2016/06/08 Javascript
setTimeout时间设置为0详细解析
2018/03/13 Javascript
JS实现遍历不规则多维数组的方法
2018/03/21 Javascript
使用vue 国际化i18n 实现多实现语言切换功能
2018/10/11 Javascript
Javascript实现鼠标点击冒泡特效
2019/12/24 Javascript
JavaScript实现拖拽功能
2020/02/11 Javascript
vue 点击其他区域关闭自定义div操作
2020/07/17 Javascript
Python数组定义方法
2016/04/13 Python
Python数据分析之真实IP请求Pandas详解
2016/11/18 Python
Python基础教程之内置函数locals()和globals()用法分析
2018/03/16 Python
python实现按行分割文件
2019/07/22 Python
马来西亚航空官方网站:Malaysia Airlines
2017/07/28 全球购物
英国标志性生活方式品牌:Skinnydip London
2019/12/15 全球购物
数学专业毕业生自荐信
2013/11/10 职场文书
初中女生自我鉴定
2013/12/19 职场文书
大学生学习自我评价
2014/01/13 职场文书
我们的节日春节活动方案
2014/08/22 职场文书
琅琊山导游词
2015/02/05 职场文书
学校百日安全活动总结
2015/05/07 职场文书
幼儿园推普周活动总结
2015/05/07 职场文书
Python生成九宫格图片的示例代码
2021/04/14 Python
一篇文章带你复习java知识点
2021/06/28 Java/Android
MySQL为数据表建立索引的原则详解
2022/03/03 MySQL