js 之sort排序原理详解

看到sort大家应该很熟悉不过了,还是简单说下它的用法,然后再来一步步来模拟下实现它的原理吧!

1.sort用法

首先sort是数组的一个方法,sort() 方法用于对数组的元素进行排序!然后返回排序后的数组。默认排序顺序是升序,建立在将元素转换为字符串,然后比较其UTF-16代码单元值的序列的基础上,请注意,该数组按位置排序,并且不进行任何复制!

一.默认无参数情况
var arr=[0,11,1,22,3,44,5]
console.log(arr.sort())//[0, 1, 11, 22, 3, 44, 5]

数组会按照字符的Unicode进行排序(把数组里面当成字符串处理)。

二.参数为对比函数情况

如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:

若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
若 a 等于 b,则返回 0。
若 a 大于 b,则返回一个大于 0 的值。

上面的描述我是从w3c上复制过来,其实说的不是很明白,很多人看的是懵的,其实你可以这样理解,传入的函数给定一对特定的元素a ,b 作为其两个参数,函数返回值大于0就是升序排列,如果是小于0就是降序!等于0就顺序不变,

var asc = (a,b)=>a-b;  //升序
var des= (a,b)=>b-a; //降序
//或者
var asc = (a, b) => a - b < 0 ? -1 : 1 //升序
var des = (a, b) => a - b < 0 ? 1 : -1 //降低序

我们先来看个例子

var asc = (a, b) => a - b < 0 ? -1 : 1 //升序
var des = (a, b) => a - b < 0 ? 1 : -1 //降低序
var arr = [10, 44, 5, 78, 1, 99];
var arr1 = [10, 44, 5, 78, 1, 99];
console.log(arr.sort(asc));// [1, 5, 10, 44, 78, 99]
console.log(arr1.sort(des))// [99, 78, 44, 10, 5, 1]
二.模拟sort的实现

首先应该注意几点
1.传入的函数必须要是函数
2.如果没传参数的话,那么就是默认升序排序方式
3.当传入的函数返回值大于0就升序排列,小于0是降序排列
根据上面几点我们自己手动模拟下

Array.prototype.sortTest = function () {
let fn = arguments ? typeof arguments[0] === "function" && arguments[0]: (x, y) => x - y;
for (var i = 0; i < this.length; i++) {
    for (var j = i + 1; j < this.length; j++) {
        if (fn(this[i], this[j]) > 0) {
            p = this[i];
            this[i] = this[j];
            this[j] = p;
        };
    };
};
return this;
}
var add = (x, y) => x - y;
var des = (x, y) => y - x;
var arr = [10, 44, 5, 78, 1, 99];
var arr1 = [10, 44, 5, 78, 1, 99];
var arr2 = [10, 44, 5, 78, 1, 99];
var arr3 = [10, 44, 5, 78, 1, 99];
console.log(arr.sortTest(add));//[1, 5, 10, 44, 78, 99]
console.log(arr1.sort(add));//[1, 5, 10, 44, 78, 99]
console.log(arr2.sortTest(des));//[99, 78, 44, 10, 5, 1]
console.log(arr3.sort(des));//[99, 78, 44, 10, 5, 1]

上面是简单的模拟下sort实现的原理!其实底层实现没有这么的简单!只是用最简单的方式来实现出来的,方便大家对sort的更深刻理解!

  • 16
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
JavaScriptsort()方法是一种常用的数组方法,它可以对数组的元素进行排序sort()方法可以对数字、字母、日期等类型的元素进行排序。它使用一个排序算法将数组元素排序,并且不会创建一个新的数组,而是直接修改原始数组。 排序算法的具体实现并不会被公开说明,因为JS引擎采用了多种不同的算法来进行排序,以根据不同的情况和场景进行选择。 sort方法默认将数组元素按照字符串顺序进行排序,即使数组的元素是数字类型。要想在数字排序时获得正确的结果,需要提供一个比较函数来告诉sort方法如何排序。比较函数需要返回一个负数、零或正数,表示相应的值应该在排序后的数组位于上一个值的前面、相同位置或者后面。 例如,如果想要按照数字大小进行升序排序,可以这样写比较函数: function compareNumbers(a, b) { return a - b; } 这个比较函数会返回一个负数、零或正数,表示a应该排在b的前面、和b相同位置或排在b的后面。 sort()方法可以排序数字、字符串、甚至是对象。在排序对象时,需要使用一个比较函数来定义排序规则,以确定哪些属性应该被用来进行排序。 需要注意的是,在使用sort方法时,进行排序时,一定需要提供一个比较函数。如果没有提供比较函数,则sort方法将按照字符串顺序进行排序,结果可能不是我们预期的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值