一、选择算法排序(算法时间复杂度为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算法排序的更多相关文章

  1. js 算法排序总结

    1.冒泡排序JavaScript代码实现: function bubbleSort(arr) { var len = arr.length; for (var i = 0; i < len; i ...

  2. JS的十大经典算法排序

    引子 有句话怎么说来着: 雷锋推倒雷峰塔,Java implements JavaScript. 当年,想凭借抱Java大腿火一把而不惜把自己名字给改了的JavaScript(原名LiveScript ...

  3. js 数组排序和算法排序

    1.算法排序 a.插入排序 var arr = [23,34,3,4,23,44,333,444]; var arrShow = (function insertionSort(array){ if( ...

  4. js算法初窥03(简单搜索及去重算法)

    前面我们了解了一些常用的排序算法,那么这篇文章我们来看看搜索算法的一些简单实现,我们先来介绍一个我们在实际工作中一定用到过的搜索算法--顺序搜索. 1.顺序搜索 其实顺序搜索十分简单,我们还是以第一篇 ...

  5. js算法初窥05(算法模式02-动态规划与贪心算法)

    在前面的文章中(js算法初窥02(排序算法02-归并.快速以及堆排)我们学习了如何用分治法来实现归并排序,那么动态规划跟分治法有点类似,但是分治法是把问题分解成互相独立的子问题,最后组合它们的结果,而 ...

  6. js算法初窥03(搜索及去重算法)

    前面我们了解了一些常用的排序算法,那么这篇文章我们来看看搜索算法的一些简单实现,我们先来介绍一个我们在实际工作中一定用到过的搜索算法——顺序搜索. 1.顺序搜索 其实顺序搜索十分简单,我们还是以第一篇 ...

  7. js算法之寻路

    A*寻路算法 算法流程说明: 说明:起始节点记作S,目标节点记作E,对于任意节点P,从S到当前节点P的总移动消耗记作GP,节点P到目标E的曼哈顿距离记作HP,从节点P到相邻节点N的移动消耗记作DPN, ...

  8. 转:js,jQuery 排序的实现,网页标签排序的实现,标签排序

    js,jQuery 排序的实现: 重点: 想要实现排序,最简单的方法就是 先把标签用jQuery读进对象数组 用js排序好对象数组 (针对对象数组进行排序, 不要试图直接对网页的内容进行直接更改) 用 ...

  9. js算法集合(一) 水仙花数 及拓展(自幂数的判断)

    js算法集合(一) ★ 最近有些朋友跟我说对js中的一些算法感到很迷惑,知道这个算法到底是怎么回事,但是就是不会用代码把它写出来,这里我跟大家分享一下做水仙花数的算法的思路,并对其扩展到自幂数的算法, ...

随机推荐

  1. System.Web.Mvc.HtmlHelper<dynamic>”没有名为“Partial”的适用方法,但似乎有一个具有该名称的扩展方法。扩展方法不能进行动态调度。请考虑强制转换动态参数,或调用该扩展方法但不使用扩展方法语法。

    MVC 调用分布式图,传了没有定义的参数,,参数写得不对

  2. C# 多线程系列之Mutex使用

    互斥量是一个内核对象,它用来确保一个线程独占一个资源的访问,并且互斥量可以用于不同进程中的线程互斥访问资源. 我们可以把Mutex看作一个出租车,乘客看作线程.乘客首先等车,然后上车,最后下车.当一个 ...

  3. vs2017启动调试,点击浏览器或输入后回车浏览器闪退,调试中断

    vs2017在启动调试后,浏览器运行,点击地址栏刚输入几个字符,mmmmm居然闪退了! 什么情况呢?测试一下,换其他浏览器进行调试,偶尔不会有问题, 可是第二天......还是一下 于是浏览器——ww ...

  4. JavaMail 邮件发送

    jar包部署 /** * 通过SMTP进行邮件集成 */ public class CmpSendMail { // 邮件发送服务器主机 private final static String HOS ...

  5. Grid标签计算结果集中的合计行

    方法一: var detailT= grid.gettable("11"); var r=detailT.rows.length; detailT.rows[r-1].cells[ ...

  6. SQL Join 语句

    SQL Join 语句 SQL 中每一种连接操作都包括一个连接类型和连接条件. 连接类型 决定了如何处理连接条件不匹配的记录. 连接类型 返回结果 inner join 只包含左右表中满足连接条件的记 ...

  7. 最新版PMBOK项目管理的五大过程组和十大知识领域

    PMBOK五大过程组是:启动过程.规划过程.执行过程.监控过程.收尾过程. 各用一句话概括项目管理知识体系五大过程组: 1.启动过程组:作用是设定项目目标,让项目团队有事可做: 2.规划过程组:作用是 ...

  8. flask接收前台的ajax的post数据

    html <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8& ...

  9. sublime_key 快捷键

    1.Ctrl+H :查找替换 2.Ctrl+D :选择游标所在单词,连续Ctrl+D 实现多行选择(选择与第一次选择相同的单词) 3.Ctrl+K Ctrl+D 跳过当前选择,选择下一个 4.Ctrl ...

  10. 【转】Javascript异步编程之setTimeout与setInterval

    Javascript异步编程之setTimeout与setInterval 转自:http://www.tuicool.com/articles/Ebueua 在谈到异步编程时,本人最主要会从以下三个 ...