javascript数组(1) ——sort的工作原理及其他数组排序方法
一说到数组排序,最直观的想法就是用sort啊!
请问不用使用sort方法还可以使用什么方法进行数组排序?
比如 : 快速排序法、合并排序法、冒泡排序法、选择排序法、插入排序法、布尔排序法、交互排序、选择排序、二分法排序.....
等等一下,在我们了解这些排序方法之前,为了更好的理解,先让我们探索一下sort的工作原理
// sort()方法:按照字符编码的顺序进行排序
var arr = [11,15,20,1000,25,2,40]
arr.sort(); // [1000, 11, 15, 2, 20, 25, 40] // sort()的两种使用方法:
// 1.不带参数,比较字符串字母的排序
var alpha =["I","L","O","V","E","W","E","B"]
alpha.sort(); //["B", "E", "E", "I", "L", "O", "V", "W"] // 2.带参数,比较数字或大小
var arr1 = [11,15,20,1000,25,2,40]
function order (a,b){
if(a>b){return 100;}
if(a<b){return -100;}
if(a==b){return 0;}
}
// 此方法还可以简化
function order (a,b){
return a-b
}
// a,b 分别取值进行比较,当a>b时为正数,当a<b时为负数,当a=b时为零。
arr.sort(order); //[2, 11, 15, 20, 25, 40, 1000]
举了上面一系列的例子,相信大家对sort排序也有了初步的认知。那么,sort排序的工作原理是什么呢?
工作原理:先比较第一个和第二个排序,再比较第三个,以此类推
下面我们来说说其他排序方法,并且比较程序的运行速度
快速排序法
快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:
(1)在数据集之中,选择一个元素作为"基准"(pivot)。
(2)所有小于"基准"的元素,都移到"基准"的前面;所有大于"基准"的元素,都移到"基准"的后面。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
(3)递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
function quicksort(arr){
if(arr.length == 0){return arr;}
var pivot =arr[0];
var left =new Array();
var right = new Array();
for (var i=1;i<arr.length;i++){
if(arr[i]<pivot){
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quicksort(left).concat(pivot,quicksort(right));
}
console.time('快速排序Tiem');
console.log(quicksort(arr));
console.timeEnd('快速排序Tiem');
合并排序法
如果列表的长度为0或1,那么它已被排序。除此以外:
(1)将未排序的列表划分为大约一半大小的两个子列表。
(2)通过重新应用合并排序来递归地排序每个子列表。
(3)将两个子列表合并成一个排序列表。
function mergeSort(arr){
if (arr.length < 2)
return arr;
var middle = parseInt(arr.length / 2);
var left = arr.slice(0, middle);
var right = arr.slice(middle, arr.length);
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;
}
console.time('合并排序Tiem');
console.log(mergeSort(arr));
console.timeEnd('合并排序Tiem');
冒泡排序法
具体算法描述如下:
(1)比较相邻的元素。如果第一个比第二个大,就交换它们两个;
(2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
(3)针对所有的元素重复以上的步骤,除了最后一个;
(4)重复步骤 (1)(3)(1)(3),直到排序完成。
function bubbleSort(arr) {
var i = 0,
len = arr.length,
j, d;
for (; i < len; i++) {
for (j = 0; j < len; j++) {
if (arr[i] < arr[j]) {
d = arr[j];
arr[j] = arr[i];
arr[i] = d;
}
}
}
return arr;
}
console.time('冒泡排序Tiem');
console.log(bubbleSort(arr));
console.timeEnd('冒泡排序Tiem');
排序方法还有很多,在这里就不一一详解了,想了解更多可以查阅javascript排序算法汇总(写的很不错的哦~!)
最后为大家推荐一个日本程序员norahiko,写的排序动画站,希望能够对数组排序的学习有所帮助๑乛◡乛๑
javascript数组(1) ——sort的工作原理及其他数组排序方法的更多相关文章
- <JavaScript>数组的sort()方法中比较函数是怎么工作的
sort()函数比较时调用的是每个数组项的toString()方法,并非按数值大小进行比较,所以往往得不到我们想要的结果. 比如: ,,,,]; values.sort( ); alert(value ...
- js数组的sort排序的原理和应用
1.js sort()方法的应用: 首先:如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序.要实现这一点,首先应把数组的元素都转换成字符串( ...
- How Javascript works (Javascript工作原理) (三) 内存管理及如何处理 4 类常见的内存泄漏问题
个人总结: 1.两种垃圾回收机制: 1)引用标记算法:如果检测到一个对象没有被引用了,就清除它. ***这种算法不能处理循环引用的情况*** 2)标记—清除算法:从根(全局变量)开始向后代变量检测,任 ...
- How Javascript works (Javascript工作原理) (二) 引擎,运行时,如何在 V8 引擎中书写最优代码的 5 条小技巧
个人总结: 一个Javascript引擎由一个标准解释程序,或者即时编译器来实现. 解释器(Interpreter): 解释一行,执行一行. 编译器(Compiler): 全部编译成机器码,统一执行. ...
- How Javascript works (Javascript工作原理) (七) WebAssembly 对比 JavaScript 及其使用场景
个人总结: 1.webworkers实现了用多线程浏览器来进行多线程操作js的能力. 2.web workers不能操作dom,window,document等对象,一般用于cpu计算型的任务. ...
- How Javascript works (Javascript工作原理) (四) 事件循环及异步编程的出现和 5 种更好的 async/await 编程方式
个人总结: 1.讲解了JS引擎,webAPI与event loop合作的机制. 2.setTimeout是把事件推送给Web API去处理,当时间到了之后才把setTimeout中的事件推入调用栈. ...
- How Javascript works (Javascript工作原理) (十五) 类和继承及 Babel 和 TypeScript 代码转换探秘
个人总结:读完这篇文章需要15分钟,文章主要讲解了Babel和TypeScript的工作原理,(例如对es6 类的转换,是将原始es6代码转换为es5代码,这些代码中包含着类似于 _classCall ...
- JavaScript 工作原理之七-Web Workers 分类及 5 个使用场景
Web Workers 分类及 5 个使用场景 原文请查阅这里,略有删减,本文采用知识共享署名 4.0 国际许可协议共享,BY Troland. 这是 JavaScript 工作原理的第七章. 本系列 ...
- JavaScript 工作原理之三-内存管理及如何处理 4 类常见的内存泄漏问题(译)
原文请查阅这里,本文有进行删减,文后增了些经验总结. 本系列持续更新中,Github 地址请查阅这里. 这是 JavaScript 工作原理的第三章. 我们将会讨论日常使用中另一个被开发者越来越忽略的 ...
随机推荐
- Unexpected end of input 和 Unexpected token var 和 Unexpected token ;
在写jsp的时候使用的一段代码一直调试,出现Unexpected token ; 错误. 所以最后把代码各种精简,得到了如下的测试示例代码 <% String aaa="123&quo ...
- jsp 文件使用 include指令 导入 jspf 分析,及导入jspf 文件后出现乱码问题
1.为什么要导入jspf文件 在做网站开发中,因为有很多的页面的导航栏是相同的,所以我们要把导航栏提取出来,生成一个jspf文件. 然后在jsp页面中使用 include 指令 导入jspf文件,这样 ...
- JAVAEE——struts2_04:自定义拦截器、struts2标签、登陆功能和校验登陆拦截器的实现
一.自定义拦截器 1.架构 2.拦截器创建 //拦截器:第一种创建方式 //拦截器生命周期:随项目的启动而创建,随项目关闭而销毁 public class MyInterceptor implemen ...
- v9 调用模型中新增的字段
在模型中新增字段的时候,可以选择“是否为主表”. 若选是,则前台调用可直接通过字段名调用. 若选否,在前台调用是应在{pc:content}中添加 moreinfo="1",表示允 ...
- vmware安装FreeBSD8.3全攻略【教程】
原始日期:2013-08-02 23:15 前言:花了两天时间倒腾这个freebsd,安装并不简单,如果单单参照百度上的教程是会遇到各种问题的,所以我打算自己写一篇教程,为了更加直观,部分采用了互联网 ...
- React.js 小书介绍
React.js 小书 Github 关于作者 这是一本关于 React.js 的小书. 因为工作中一直在使用 React.js,也一直以来想总结一下自己关于 React.js 的一些知识.经验.于是 ...
- [leetcode-434-Number of Segments in a String]
Count the number of segments in a string, where a segment is defined to be a contiguous sequence of ...
- Java内部类与final关键字详解
一.内部类的几种创建方法: 1.成员内部类 class Outer{ private int i = 1; class Inner{ public void fun() {System.out.pri ...
- js的DOM操作
ID选择器:document.getElementById("").innerHTML="" class选择器:var divc= document.getEl ...
- JanaScript预解析
JS预解析是什么? 在当前的作用域下,js运行之前.会有带有 var 和 function关键字的代码事先声明, 并在内存中安排好,然后从上到下的执行js代码. JS预解析 js逐 ...