给出以下数组,并进行排序处理

var arr = new Array('1','3','8','2','3','5');

1、 插入法排序

Array.prototype.csSort = function() {
var newarr = this;
/** 1、 插入法排序
* 插入发排序,即那数组的后边一项和前面一项对比,如果后面一项小于前面
* 一项,则将两者位置互换,从数组第2个元素开始对比;如下示例
*/
for (let i = 1; i < newarr.length; i++) {
for (let j = i; j > 0; j--) {
if (newarr[j] < newarr[j-1]) {
let pre = newarr[j];
newarr[j] = newarr[j-1];
newarr[j-1] = pre;
};
};
};
return newarr;
}
console.log(arr.csSort().toString());

2、 冒泡法排序

Array.prototype.csSort = function() {
var newarr = this;
/** 2、 冒泡法排序
* 插入发排序,即那数组的前一项和后一项对比,如果前面一项小于后面
* 一项,则将两者位置互换,从数组第1个元素开始对比;如下示例
*/
for (let i = 0; i < newarr.length; i++) {
for (let j = 0; j < newarr.length; j++) {
if (newarr[j] > newarr[j+1]) {
let pre = newarr[j];
newarr[j] = newarr[j+1];
newarr[j+1] = pre;
};
};
};
return newarr;
}
console.log(arr.csSort().toString());

sort排序的实现原理

js中sort排序方法使用简单,用于对数组排序,并返回数组,使用方法也很简单

Array.sort()

可以看出sort是一个方法,该方法内部对该数组对象进行一些操作,又返回来一个数组,不传参数的话排序默认根据字符串的Unicode排序

如下代码:

 var arr = new Array('1','3','8','55','2','3','5','66');
arr = arr.sort();
console.log(arr.toString())
// 1,2,3,3,5,55,66,8

可以看到上面的输出结果并没有按照大小进行排列,所以这种情况就需要往sort里传入一个参数

Array.sort(func);

传递参数这种情况所传的参数必须为一个函数,该函数对a,b两个参数进行比较,返回一个结果,具体如下

a 大于 b 返回一个大于0的值,a在b位置的后面

a 等于 b 返回一个等于0的值,a、b位置不变

a 小于 b 返回一个小于0的值,a在b位置的前面

如下代码

 var arr = new Array('1','3','8','55','2','3','5','66');
function compare(a, b) {
return a - b;
}
arr = arr.sort(compare);
console.log(arr.toString())
// 1,2,3,3,5,8,55,66

当compare函数里返回a-b的时候,可以看到是升序排列,再看以下降序

var arr = new Array('1','3','8','55','2','3','5','66');
function compare(a, b) {
return b - a;
}
arr = arr.sort(compare);
console.log(arr.toString())
// 66,55,8,5,3,3,2,1

对于对象的处理也是如此

var arr = [
{name:"zhangsan", age: 21},
{name:"lisi", age: 23},
{name:"wangwu", age: 20},
{name:"zhaoliu", age: 18},
{name:"xiaoming", age: 17},
{name:"xiaolan", age: 25}
]
function compare(arg) {
return function(a, b) {
return a[arg] - b[arg];
}
}
arr = arr.sort(compare('age'));
console.log(arr)

结果为

可以根据对象的某一个属性进行排序

sort的使用方法是很简单,究其原理感觉内部是冒泡排序的原理,通过对相邻的两个元素对比,如果前面的必后面的小,则位置不变,反之则替换位置,其原理可参考上面提到过的冒泡排序原理。

js几种数组排序及sort的实现的更多相关文章

  1. 深入探讨JS中的数组排序函数sort()和reverse()

    最近在研究Javascript发现了其中一些比较灵异的事情.有点让人感到无语比如: alert(typeof( NaN == NaN));//结果为假. alert(typeof( NaN != Na ...

  2. JS中的数组排序函数sort()

    JavaScript实现多维数组.对象数组排序,其实用的就是原生的sort()方法,用于对数组的元素进行排序. sort() 方法用于对数组的元素进行排序.语法如下: arrayObject.sort ...

  3. JS二维数组排序组合

    需求是这样的:http://q.cnblogs.com/q/29093/ 这里简述一下: 现在有一个不确定长度的数组.比如:var temp=[["Fu","Hai&qu ...

  4. JS几种数组遍历方式以及性能分析对比

    前言 这一篇与上一篇 JS几种变量交换方式以及性能分析对比 属于同一个系列,本文继续分析JS中几种常用的数组遍历方式以及各自的性能对比 起由 在上一次分析了JS几种常用变量交换方式以及各自性能后,觉得 ...

  5. js两种定义函数、继承方式及区别

    一:js两种定义函数的方式及区别 1:函数声明: function sayA() { alert("i am A"); } 2:函数表达式: var sayB = function ...

  6. 【翻译】在Ext JS 5种使用ViewControllers

    原文:Using ViewControllers in Ext JS 5 简单介绍 在Ext JS 5中,在应用程序架构方面提供了一些令人兴奋的改进,如加入了ViewModels.MVVM以及view ...

  7. 原生Js 两种方法实现页面关键字高亮显示

    原生Js 两种方法实现页面关键字高亮显示 上网看了看别人写的,不是兼容问题就是代码繁琐,自己琢磨了一下用两种方法都可以实现,各有利弊. 方法一 依靠正则表达式修改 1.获取obj的html2.统一替换 ...

  8. js介绍,js三种引入方式,js选择器,js四种调试方式,js操作页面文档DOM(修改文本,修改css样式,修改属性)

    js介绍 js运行编写在浏览器上的脚本语言(外挂,具有逻辑性) 脚本语言:运行在浏览器上的独立的代码块(具有逻辑性) 操作BOM 浏览器对象盒子 操作DOM 文本对象 js三种引入方式 (1)行间式: ...

  9. 2.32 js几种定位方法总结

    2.32 js几种定位方法总结 前言本篇总结了几种js常用的定位元素方法,并用js点击按钮,对input输入框输入文本 一.以下总结了5种js定位的方法除了id是定位到的是单个element元素对象, ...

随机推荐

  1. 【linux命令之 tail学习】

    tail 在屏幕上显示指定文件的末尾若干行 tail file #(显示文件file的最后10行) tail -n +20 file #(显示文件file的内容,从第20行至文件末尾) tail -c ...

  2. 123457123457#0#-----com.tym.PuzzleGame28--前拼后广--日常pt-tym

    com.tym.PuzzleGame28--前拼后广--日常pt-tym

  3. 报错:Unable to read additional data from client sessionid 0x36ab52d38c20b20, likely client has closed socket

    报错背景: CDH集群中,将kafka和Flume整合,将kafka的数据发送给Flume消费. 启动kafka的时候正常,但是启动Flume的时候出现了报错现象. 但是我检查了Flume,Flume ...

  4. Flink 自定义source和sink,获取kafka的key,输出指定key

    --------20190905更新------- 沙雕了,可以用  JSONKeyValueDeserializationSchema,接收ObjectNode的数据,如果有key,会放在Objec ...

  5. bootstrap 自带字体颜色

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. MySQL中事务的隔离级别

    MySQl InnoDB存储引擎实现SQL标准的4种隔离级别(RU,RC,RR,serializable),用来限定事务内外的哪些改变时可见的,哪些时不可见的.低级别的隔离级一般支持更高的并发处理,并 ...

  7. 【GStreamer开发】GStreamer播放教程08——视频解码的硬件加速

    目标 视频的硬件解码近来发展非常快速,尤其是在低功耗的设备上.本教程会讲述一些硬件加速的背景知识并解释一下GStreamer是怎么做的. 悄悄告诉你,如果设置正确地话,我们什么也不用做,GStream ...

  8. linux中信号的API详解实例

    /************************************************************************* > File Name: signal.c ...

  9. 013 Android 实现流水灯功能+自定义控件的样式(可以复用)

    1.介绍 (1)获取屏幕的焦点 android:focusable与android:focusableInTouchMode(获取屏幕焦点) 前者针对在键盘下操作的情况,如果设置为true,则键盘上下 ...

  10. java微服务的统一配置中心

    为了更好的管理应用的配置,也为了不用每次更改配置都重启应用,我们可以使用配置中心 关于eureka的服务注册和rabbitMQ的安装使用(自动更新配置需要用到rabbitMQ)这里不赘述,只关注配置中 ...