JS数据结构与算法-快速排序与二分查找算法
时间:2022-06-09
本文章向大家介绍JS数据结构与算法-快速排序与二分查找算法,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
- 快速排序 快速排序是处理大数据集最快的排序算法之一。它是一种分而治之的算法,通过递归的方式将数据依次分解为包含较小元素和较大元素的不同子序列。该算法通过不断重复这个步骤知道所有数据都是有序的。
- 算法实现 这个算法首先要在列表中选择一个元素作为基准值(pivot)。数据排序围绕基准值进行,将列表中小于基准值的元素移到数组的底部(左边),将大于基准值的元素移到数组的顶部(右边)。 ①选择一个基准元素,将列表分成两个子序列; ②对列表重新排序,将所有小于基准值的元素放在基准值前面,所有大于基准值的元素放在基准值的后面; ③分别对较小的元素的子序列和较大元素的子序列重复步骤①和步骤②。
function qSort(list) {
//检查数组的长度是否为0,是则不需要任何排序,返回空数组
if(list.length == 0) {
return [];
}
//创建两个数组,一个用来存放比基准小的元素,另一个存放比基准值大的元素
var left = [];
var right = [];
//基准值取自数组的第一个元素
var pivot = list[0];
//遍历数组,根据它们与基准值的关系放到合适的数组中
for(var i=1;i<list.length;i++) {
if(list[i] < pivot) {
left.push(list[i]);
}else{
right.push(list[i]);
}
}
//然后对于较小的数组和较大的数组分别递归调用这个函数
return qSort(left).concat(pivot,qSort(right));
}
var test = [4,3,5,1,2];
console.log(qSort(test)); //[1,2,3,4,5]
ps:递归的过程大概是这样
灵魂画手
- 二分法算法 如果你要查找的数据是有序的,二分查找算法比顺序查找算法更高效。
- 算法理解 二分搜索算法的原理和猜数字游戏类似,就是那个有人说“我正想着一个1到100的数字”的游戏。我们每回应一个数字,那个人就会说这个数字是高了、低了还是对了。
- 算法描述 ①选择中间值; ②如果选择的值是待搜索的值,算法结束并返回; ③如果待搜索值比选中值要小,则返回步骤①并在选中值左边的子数组中寻找。 ④如果待搜索值比选中值要大,则返回步骤①并在选中值右边的子数组中寻找。
- 算法实现
function binSearch(arr,data) {
//将传入的数组用快速排序算法排序一下
var arr = qSort(arr);
//将最后一个元素所在的位置设为上边界
var upperBound = arr.length-1;
//将数组的第一个位置设为下边界
var lowerBound = 0;
while(lowerBound <= upperBound) {
//中点
var mid = Math.floor((upperBound + lowerBound)/2);
//如果待查询的值大于中点元素,则将下边界设置为中点元素所在下标加1,也就是选取数组的右半边(不包括中点元素),然后再在里面查找
if(arr[mid] < data) {
lowerBound = mid+1;
//如果待查询的值小于中点元素,同理如上
}else if(arr[mid] > data) {
upperBound = mid-1;
//否则如果相等,返回
}else {
return mid;
}
}
return -1;
}
var test = [1,2,3,4,5,6];
console.log(binSearch(test,2)); //位置"1"
执行步骤:
执行步骤.png
参考学习:
《数据结构与算法javascript描述》 《学习javascript数据结构与算法》
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 详解Flask前后端分离项目案例
- Laravel5.1 框架表单验证操作实例详解
- 通过实例了解Python异常处理机制底层实现
- header函数设置响应头解决php跨域问题实例详解
- Linux采用双网卡bond、起子接口的方式
- PHP实现字母数字混合验证码功能
- php+pdo实现的购物车类完整示例
- CentOS7怎么执行PHP定时任务详解
- Linux下PHP+Apache的26个必知的安全设置
- linux中ssh免密通信的实现
- 怎么修改CentOS服务器时间为北京时间
- Laravel5.1 框架控制器基础用法实例分析
- Laravel5.1 框架模型软删除操作实例分析
- Laravel 手动开关 Eloquent 修改器的操作方法
- 怎么测试Linux下tcp最大连接数限制详解