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 相关文章推荐
关于js日期转化为毫秒数“节省20%的效率和和节省9个字符“问题
Mar 01 Javascript
jQuery实现限制textarea文本框输入字符数量的方法
May 28 Javascript
js跨域请求数据的3种常用的方法
Dec 01 Javascript
AngularJS初始化静态模板详解
Jan 14 Javascript
AngularJs实现分页功能不带省略号的代码
May 30 Javascript
jQuery文字提示与图片提示效果实现方法
Jul 04 Javascript
js实现可输入可选择的select下拉框
Dec 21 Javascript
js仿微信公众平台打标签功能
Apr 08 Javascript
通过V8源码看一个关于JS数组排序的诡异问题
Aug 14 Javascript
jquery使用FormData实现异步上传文件
Oct 25 jQuery
ES6基础之 Promise 对象用法实例详解
Aug 22 Javascript
Vue的生命周期操作示例
Sep 17 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常见问题集锦及解决办法总结
2007/03/18 PHP
.htaccess文件保护实例讲解
2011/02/06 PHP
解析用PHP读写音频文件信息的详解(支持WMA和MP3)
2013/05/10 PHP
PHP函数strip_tags的一个bug浅析
2014/05/22 PHP
PHP xpath()函数讲解
2019/02/11 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
2019/10/04 PHP
laravel中Redis队列监听中断的分析
2020/09/14 PHP
JavaScript高级程序设计
2006/12/29 Javascript
通过JavaScript使Div居中并随网页大小改变而改变
2013/06/24 Javascript
JavaScript中this的使用详解
2013/11/08 Javascript
使用jQuery简单实现模拟浏览器搜索功能
2014/12/21 Javascript
jquery实现点击label的同时触发文本框点击事件的方法
2015/06/05 Javascript
详解JavaScript时间处理之几个月前或几个月后的指定日期
2016/12/21 Javascript
Angularjs实现搜索关键字高亮显示效果
2017/01/17 Javascript
原生js FileReader对象实现图片上传本地预览效果
2020/03/27 Javascript
基于LayUI分页和LayUI laypage分页的使用示例
2017/08/02 Javascript
vuejs事件中心管理组件间的通信详解
2017/08/09 Javascript
Angular表格神器ui-grid应用详解
2017/09/29 Javascript
解决vue打包项目后刷新404的问题
2018/03/06 Javascript
详解vue几种主动刷新的方法总结
2019/02/19 Javascript
使用Three.js实现太阳系八大行星的自转公转示例代码
2019/04/09 Javascript
[01:23:24]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第三场 2月7日
2021/03/11 DOTA
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
2011/03/13 Python
Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)
2019/06/28 Python
python中sort和sorted排序的实例方法
2019/08/26 Python
pandas和spark dataframe互相转换实例详解
2020/02/18 Python
用CSS3实现瀑布流布局的示例代码
2017/11/10 HTML / CSS
CSS3改变浏览器滚动条样式
2019/01/04 HTML / CSS
ziaja齐叶雅官方海外旗舰店:来自波兰的天然护肤品牌
2017/01/02 全球购物
世界上最值得信赖的多日游在线市场:TourRadar
2018/07/20 全球购物
大学生的四年学习自我评价
2013/12/13 职场文书
党支部对照检查材料
2014/08/25 职场文书
初中教师个人总结
2015/02/10 职场文书
西安导游词
2015/02/12 职场文书
mysql timestamp比较查询遇到的坑及解决
2021/11/27 MySQL
MySql如何将查询的出来的字段进行转换
2022/06/14 MySQL