js算法排序
一、选择算法排序(算法时间复杂度为O(n²)级别)
选择排序就是选择数组中的最小的树,依次排序。第一次选择最小的数放在第一位,第二次从剩余的元素中寻找最小的元素放在第二位,第三次在剩余的数中选择最小的数放在第三位,依次类推
function getMInDate(arr){
var minIndex;
var minValue;
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;
}
}
minValue=arr[i];
arr[i]=arr[minIndex];
arr[minIndex]=minValue;
}
return arr;
}
二、插入算法排序(算法时间复杂度为O(n²)级别)
类似于打牌,选择合适的插入位置。第一个数位第一个元素,将第二个元素与前一个元素进行对比,如果小了,就交换位置。依次往前进行对比。将第三个元素与前一个元素进行对比,如果小于前一个元素,就与前一个元素进行交换,依次往前进行对比。依次类推。
function insertDate(arr){
var _value;
for(var i=1;i<arr.length;i++){
for(var j=i;j>0;j--){
if(arr[j]<arr[j-1]){
_value=arr[j];
arr[j]=arr[j-1];
arr[j-1]=_value;
}
}
}
return arr;
}
插入排序的优化:
由于前后元素用赋值的方法进行替换,比较耗性能。可以将要对比的元素复制,依次与前面的元素进行对比,如果这个元素比前一个元素小,前一个元素就等于前前个元素,依次遍历,如果复制的元素比对比的元素要大,就将复制的元素赋值给对比的元素。依此类推。
//插入排序的优化1 减少交换
function cloneDate(arr){
var e;
var _value;
var j;
for(var i=1;i<arr.length;i++){
e=arr[i];
j=i;
while(j>=1 && arr[j-1]>e){
arr[j]=arr[j-1];
j--;
}
arr[j]=e;
}
return arr;
} //插入排序的优化2 减少交换
function cloneDate3(arr){
var e;
for(var i=1;i<arr.length;i++){
e=arr[i];
for(var j=i;j>0;j--){
if(arr[j-1]>e){
arr[j]=arr[j-1];
}else{
break;
}
}
arr[j]=e;
}
return arr;
}
三、归并算法排序(算法时间复杂度为O(nlogn)级别)
自顶向下,使用递归。比较简洁
1.先将C划分为两个数组A和B(即把数组C从中间分开)
2.再分别对数组A、B重复步骤1的操作,逐步划分,直到不能再划分为止(每个子数组只剩下一个元素),这样,划分的过程就结束了。
如: [12 20 30 21 15 33 26 19 40 25]
划分为: [12 20 30 21 15] [33 26 19 40 25]
[12 20] [30 21 15] [33 26] [19 40 25]
[12] [20] [30] [21 15] [33] [26] [19] [40 25]
[12] [20] [30] [21] [15] [33] [26] [19] [40] [25]
3.然后从下层往上层不断合并数组,每一层合并相邻的两个子数组,合并的过程是每次从待合并的两个子数组中选取一个最小的元素,然后把这个元素放到合并后的数组中,不断重复直到把两个子数组的元素都放到合并后的数组为止。
4.依次类推,直到合并到最上层结束,这时数据的排序已经完成了。
//归并算法
function mergeSort(arr){
if(arr.length<2){
return arr;
}
//设立一个中间值
var middle=parseInt(arr.length/2);
//第一个值与middle之间的左子列
var left=arr.slice(0,middle)
//第middle+1个值到最后的右子列
var right=arr.slice(middle);
if(left=="undefined" && right=="undefined"){
return false;
}
return merge(mergeSort(left),mergeSort(right));
} function merge(left,right){
var result=[];
//左右子列有值
while(left.length && right.length){
if(left[0]<=right[0]){
result.push(left.shift())
}else{
result.push(right.shift())
}
}
//只有左子列有值
while(left.length){
result.push(left.shift())
}
//只有右子列有值
while(right.length){
result.push(right.shift())
}
return result;
}
暂时写了三种,后续补充。
js算法排序的更多相关文章
- js 算法排序总结
1.冒泡排序JavaScript代码实现: function bubbleSort(arr) { var len = arr.length; for (var i = 0; i < len; i ...
- JS的十大经典算法排序
引子 有句话怎么说来着: 雷锋推倒雷峰塔,Java implements JavaScript. 当年,想凭借抱Java大腿火一把而不惜把自己名字给改了的JavaScript(原名LiveScript ...
- js 数组排序和算法排序
1.算法排序 a.插入排序 var arr = [23,34,3,4,23,44,333,444]; var arrShow = (function insertionSort(array){ if( ...
- js算法初窥03(简单搜索及去重算法)
前面我们了解了一些常用的排序算法,那么这篇文章我们来看看搜索算法的一些简单实现,我们先来介绍一个我们在实际工作中一定用到过的搜索算法--顺序搜索. 1.顺序搜索 其实顺序搜索十分简单,我们还是以第一篇 ...
- js算法初窥05(算法模式02-动态规划与贪心算法)
在前面的文章中(js算法初窥02(排序算法02-归并.快速以及堆排)我们学习了如何用分治法来实现归并排序,那么动态规划跟分治法有点类似,但是分治法是把问题分解成互相独立的子问题,最后组合它们的结果,而 ...
- js算法初窥03(搜索及去重算法)
前面我们了解了一些常用的排序算法,那么这篇文章我们来看看搜索算法的一些简单实现,我们先来介绍一个我们在实际工作中一定用到过的搜索算法——顺序搜索. 1.顺序搜索 其实顺序搜索十分简单,我们还是以第一篇 ...
- js算法之寻路
A*寻路算法 算法流程说明: 说明:起始节点记作S,目标节点记作E,对于任意节点P,从S到当前节点P的总移动消耗记作GP,节点P到目标E的曼哈顿距离记作HP,从节点P到相邻节点N的移动消耗记作DPN, ...
- 转:js,jQuery 排序的实现,网页标签排序的实现,标签排序
js,jQuery 排序的实现: 重点: 想要实现排序,最简单的方法就是 先把标签用jQuery读进对象数组 用js排序好对象数组 (针对对象数组进行排序, 不要试图直接对网页的内容进行直接更改) 用 ...
- js算法集合(一) 水仙花数 及拓展(自幂数的判断)
js算法集合(一) ★ 最近有些朋友跟我说对js中的一些算法感到很迷惑,知道这个算法到底是怎么回事,但是就是不会用代码把它写出来,这里我跟大家分享一下做水仙花数的算法的思路,并对其扩展到自幂数的算法, ...
随机推荐
- PL/SQL之流控制语句
1.选择控制语句 --语法1--IF 条件 THEN 语句; END IF; DECLARE v_Salary ,); BEGIN SELECT salary INTO v_Salary FROM a ...
- javaweb之EL自定义函数
1.什么是EL自定义函数 EL自定义函数是在EL表达式中调用的某个java类的静态方法,这个静态方法需在web应用程序中进行配置才可以被EL表达式调用.EL自定义函数可以扩展EL表达式的功能,让EL表 ...
- Hibernate 注解 (Annotations 三)多对一双向注解
注解(Annotation),也叫元数据.一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次.它可以声明在包.类.字段.方法.局部变量.方法参数等的前面,用来 ...
- Bzoj2654:tree
题目 Bzoj Sol 神题! 二分所有的白边减去一个值,这样做\(kruskal\)就会多选一些白边 就这样 二分范围为\([-101, 101]\)!!! # include <bits/s ...
- java中如何使用BigDecimal使得Double类型保留两位有效数字
一.场景:从数据表中读出Decimal类型的数据直接塞给Double类型的对象时,并不会有什么异常. 如果要再此基础上计算,就会发生异常. 比如:读出数据为0.0092,将其乘以100,则变成了0.9 ...
- 巧用dynamic给对象字段动态赋值(经测试无效,使用反射解决)
动态把json对象的字段值赋给某个对象的字段 var dt=Utils.JsonDataTableConvert.ToDataTable(tableJson); foreach (DataRow ro ...
- angular ng指令
1.指令 ng-app,ng- 都是angular的指令系统ng-app: ng-app是angular的初始化,一个页面只能有一个ng-app,位置不限制.在页面上加入了这个执行,那么从当前的元素以 ...
- KMP算法的一个简单实现
今天学习KMP算法,参考网上内容,实现算法,摘录网页内容并记录自己的实现如下: 原文出处: http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93M ...
- Windows 8 Metro风格颜色表-Metro colours
http://huaban.com/pins/538986818
- JNLP文件具体说明编辑
JNLP(Java Network Launching Protocol )是java提供的一种可以通过浏览器直接执行java应用程序的途径,它使你可以直接通过一个网页上的url连接打开一个java应 ...