js排序算法总结
快速排序
大致分三步:
1、找基准(一般是以中间项为基准)
2、遍历数组,小于基准的放在left,大于基准的放在right
3、递归
快速排序的平均时间复杂度是O(nlogn),最差情况是O(n²)。
代码实现
function quickSort(arr){
//如果数组<=1,则直接返回
if(arr.length<=1){return arr;}
var pivotIndex=Math.floor(arr.length/2);
//找基准,并把基准从原数组删除
var pivot=arr.splice(pivotIndex,1)[0];
//定义左右数组
var left=[];
var right=[];
//比基准小的放在left,比基准大的放在right
for(var i=0;i<arr.length;i++){
if(arr[i]<=pivot){
left.push(arr[i]);
}
else{
right.push(arr[i]);
}
}
//递归
return quickSort(left).concat([pivot],quickSort(right));
// [...quickSort(left),pivot,...quickSort(right)]
}
冒泡排序
1、比较相邻的两个元素,如果前一个比后一个大,则交换位置 (默认从小到大排序)。
2、比较完第一轮的时候,最后一个元素是最大的元素。
3、这时候最后一个元素是最大的,所以最后一个元素就不需要参与比较大小。
代码实现
function bubble(arr){
//常规 数组加判断
if (arr instanceof Array && arr.length > 1) {
}
//外层循环,控制趟数,每一次找到一个最大值
for (var i = 0; i < arr.length - 1; i++) {
// 内层循环,控制比较的次数,并且判断两个数的大小
for (var j = 0; j < arr.length - 1 - i; j++) {
//如果前面的数大,放到后面(当然是从小到大的冒泡排序)
if (arr[j] > arr[j + 1]) {
var temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr
}
二分查找
二分查找,也为折半查找。首先要找到一个中间值,通过与中间值比较,大的放又,小的放在左边。再在两边中寻找中间值,持续以上操作,直到找到所在位置为止。
(递归方法)
function binarySearch(arr,dest,start,end){
var end = end || arr.length-1,
start=start || 0,
mid = Math.floor((start+end)/2);
if(dest==arr[mid]){
return mid
}
if(dest<arr[mid]){
return binarySearch(arr,dest,0,mid-1)
}else{
return binarySearch(arr,dest,mid+1,end)
}
return false
}
var arrData =[-34,1,3,4,5,8,34,45,65,87]
console.log(binarySearch(arrData,4)) //
(非递归方法)
function binarySearch(arr,dest,start,end){
var end = end || arr.length-1,start=start || 0;
while(start<=end){
var mid=Math.floor((start+end)/2)
if(dest==arr[mid]){
return mid
}
if(dest>arr[mid]){
start=mid+1
}else{
end=mid-1
}
}
return false
}
var arrData =[-34,1,3,4,5,8,34,45,65,87]
console.log(binarySearch(arrData,4)) //
插入排序
(1) 从第一个元素开始,该元素可以认为已经被排序
(2) 取出下一个元素,在已经排序的元素序列中从后向前扫描
(3) 如果该元素(已排序)大于新元素,将该元素移到下一位置
(4) 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
(5) 将新元素插入到下一位置中
(6) 重复步骤2
function insertSort(arr){
//假设第0个元素是一个有序的数列,第1个以后的是无序的序列
//所以从第一个元素开始将无序数列的元素插入到有序数列中
for (var i = 1; i < arr.length; i++) {
//升序
if(arr[i]<arr[i-1]){
//取出无序数列中的第i个作为被插入的元素
var temp=arr[i]
//记住有序数列的最后一个位置,并且将有序数列位置扩大一个
var j =i-1
arr[i]=arr[i]
//比大学,找到被插入元素所在的位置
while (j>=0 && temp<arr[j]) {
arr[j+1]=arr[j]
j--
}
arr[j+1]=temp //插入
}
}
return arr
}
选择排序
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
以此类推,直到所有元素均排序完毕。
function selectionSort(arr){
var minIndex,temp;
for (var i = 0; i < arr.length; i++) {
minIndex=i
for (var j = i+1; j < arr.length; j++) {
//寻找最小的数
if(arr[j]<arr[minIndex]){
minIndex=j //将最小数的索引保存
}
}
temp=arr[i]
arr[i]=arr[minIndex]
arr[minIndex]=temp
}
return arr
}
更多排序算法:https://www.cnblogs.com/onepixel/articles/7674659.html
js排序算法总结的更多相关文章
- 总结下js排序算法和乱序算法
其实本人最怕的就是算法,大学算法课就感觉老师在讲天书,而且对于前端来说,算法在实际的应用中实在是很有限.毕竟算法要依靠大量的数据为基础才能发挥出算法的效率,就浏览器那性能,......是吧,退一万步说 ...
- 排序图解:js排序算法实现
之前写过js实现数组去重, 今天继续研究数组: 排序算法实现. 排序是数据结构主要内容,并不限于语言主要在于思想:大学曾经用C语言研究过一段时间的排序实现, 这段时间有空用JS再将排序知识点熟悉一遍. ...
- js排序算法汇总
JS家的排序算法 十大经典算法排序总结对比 一张图概括: 主流排序算法概览 名词解释: n: 数据规模k:“桶”的个数In-place: 占用常数内存,不占用额外内存Out-place: 占用额外 ...
- 常用的 JS 排序算法整理
关于排序算法的问题可以在网上搜到一大堆,但是纯 JS 版比较零散,之前面试的时候特意整理了一遍,附带排序效率比较. //1.冒泡排序 var bubbleSort = function(arr) { ...
- 自己写的JS排序算法
这学期刚刚学完数据结构,之前就自己写了一点东西,现在整理一下. <!DOCTYPE html> <html> <head> <meta charset=&qu ...
- js排序算法总结—冒泡,快速,选择,插入,希尔,归并
相信排序是任何一个程序猿都会用到的东西,今天简单总结记录下常见的排序算法. 一.冒泡排序 说起冒泡排序,可能每个人都不会陌生,实现思路相当简单明了,就是不停的对数组进行两两比较,将较大(较小)的一项放 ...
- js排序算法总结——冒泡,快速,选择,插入,希尔,归并
相信排序是任何一个程序猿都会用到的东西,今天简单总结记录下常见的排序算法. 一.冒泡排序 说起冒泡排序,可能每个人都不会陌生,实现思路相当简单明了,就是不停的对数组进行两两比较,将较大(较小)的一项放 ...
- 结构-行为-样式-Js排序算法之 直接插入排序
最新因工作原因需要接触到算法,之前学习C++的时候有接触过算法,Javascript中实现算法其实也是大同小异.下面我讲下第一个实现的排序算法--直接插入排序.基本实现思路:假定一个数组中前n(n&g ...
- JS排序算法
1.冒泡排序 冒泡算法是比较相邻的两项,如果前者比后者大,就交换他们. 假设一共有n项,那么一共需要n-1趟,第一趟需要交换n-1次,但是第一趟结束后,最后一项基本确定就是最大项了,所以第二次需要交换 ...
随机推荐
- Linux之磁盘挂载
1.查看磁盘分区情况: fdisk -l 可以看到,红框中的硬盘没有分区. 2.开始分区: fdisk /dev/vdb 3.格式化分区: mkfs.xfs 分区名 4.挂载磁盘 挂载方式1: 手动挂 ...
- MySQL 通过多个示例学习索引
最近在准备面试,关于索引这一块,发现很多以前忽略的点,这里好好整理一下 首先为什么要建立索引 一本书,有章.节.段.行这种单位. 如果现在需要找一个内容:第9章>第2节>第3段>第4 ...
- 【kindle笔记】之 《犬夜叉》-2017-12-26
[kindle笔记]读书记录-总 2017-12-26 <犬夜叉> 买kindle的初衷是看计算机工具书看得眼快瞎了,我弟弟推荐给我的Linux系列<鸟叔私房菜> 真的是深思熟 ...
- JS 验证输入框输入 只允许输入正实数(正整数,正小数),其他情况下不能输入 oninput事件
input标签的oninput事件 要求输入框只输入正实数,包括整数和小数. 具体要求:整数部分不超过7位,可以没有小数,若有位数不超过2位. <input type="text&qu ...
- [转帖]中关村:LED屏幕和OLED屏幕有什么区别?答案在这里
LED屏幕和OLED屏幕有什么区别?答案在这里 中关村在线 01-0810:40 目前的电视市场,更新换代的频率越来越快,无论是国产品牌还是合资品牌,都不约而同的推出了全新产品.这离不开人们对更好 ...
- spring AOP源码分析(一)
对于springAOP的源码分析,我打算分三部分来讲解:1.配置文件的解析,解析为BeanDefination和其他信息然后注册到BeanFactory中:2.为目标对象配置增强行为以及代理对象的生成 ...
- word的"bug"
发表博客发现,从word复制文本到chrome浏览器上的博客时, 如果复制完后立即关闭word,那么将无法粘贴到通过chrome浏览器访问的博客上,也无法粘贴到记事本上: 但是复制完立即关闭word后 ...
- idea 方便的设置代码段
使用快捷键(ctrl+alt+s)找到:从idea的菜单File->Settings->Editor->Live Templates 先添加Template Group,然后添加Li ...
- java学习之—链表(3)
/** * 使用链表实现队列 * Create by Administrator * 2018/6/19 0019 * 下午 4:37 **/ public class Link { public l ...
- delphi中adoquery控件中某个字段Onvalidate事件的用法?
procedure TForm2.ADOQuery1TestFieldValidate(Sender: TField);begin// Sender就是当前字段,可以在这里对Sender字段进行各种操 ...