数组sort方法源码解析

我们提到数组排序都会想到数组的sort方法,这个方法用起来的确很方便,其原理还是用到了我们的冒泡排序,sort函数接受一个参数,参数为一个函数,如果不指定参数,则按照则按unicode码顺序排列。

var arr=[7,3,6,1,5,12];
console.log(arr.sort());//[1, 12, 3, 5, 6, 7]
console.log(arr.sort(function(a,b){
     return a-b;
})); //[1, 3, 5, 6, 7, 12]

其实源码实现也不是很难,首先我们要知道的这是数组上的一个方法,肯定是写在数组构造函数的原型上,这样所有的数组实例才能共享这个方法,首先传入一个函数,根据函数的返回值来确定数组的顺序。话不多说,直接上代码

  Array.prototype.customeSort = function (func) {
                var array = this;//保存this对象,这个指的是调用sort方法的数组对象
                for (var i = 0; i < array.length - 1; i++) {
                    for (j = 0; j < array.length - i - 1; j++) { //需要走双层循环,一层循环只能确保最后一个元素是最大或者是最小,需要依次往前遍历
                        var val = func(array[j], array[j + 1]);
                        if (val > 0) {//通过函数返回值交换两个数组元素
                            array[j] = array[j] + array[j + 1];
                            array[j + 1] = array[j] - array[j + 1];
                            array[j] = array[j] - array[j + 1];
                        }
                    }
                }
                return array;
            }

这个时候一个简单的sort方法已经基本上实现了,但是我们前面说过了,sort也有不传入参数的情况,因为我们无法控制别人如何调用,这个时候func就报错了 。

因为找不到这个函数,我们就需要判断做一下处理,

  Array.prototype.customeSort = function (func) {
                var array = this;
                if (func == undefined) {如果什么都传,就比较他们的unicode码
                    for (var i = 0; i < array.length - 1; i++) {
                        for (j = 0; j < array.length - i - 1; j++) {
                            var temp;//定义一个变量,用来暂时储蓄临时变量,给他们交换
                            if (String(array[j])>String(array[j + 1])) {
                                 temp= array[j + 1];
                                 array[j+1]=array[j];
                                 array[j]=temp;
                            }
                        }
                    }
                }
                else if(typeof func=="function") {//如果传入函数,就执行下面的代码
                    for (var i = 0; i < array.length - 1; i++) {
                        for (j = 0; j < array.length - i - 1; j++) {
                            var val = func(array[j], array[j + 1]);
                            if (val > 0) {
                                array[j] = array[j] + array[j + 1];
                                array[j + 1] = array[j] - array[j + 1];
                                array[j] = array[j] - array[j + 1];
                            }
                        }
                    }
                }
                return array;
            }

  现在一个完整的sort方法就基本上实现了,不足之处请大家指正。

原文地址:https://www.cnblogs.com/shentao11023/p/10996852.html

时间: 2024-11-08 00:22:06

数组sort方法源码解析的相关文章

erlang下lists模块sort(排序)方法源码解析(二)

上接erlang下lists模块sort(排序)方法源码解析(一),到目前为止,list列表已经被分割成N个列表,而且每个列表的元素是有序的(从大到小) 下面我们重点来看看mergel和rmergel模块,因为我们先前主要分析的split_1_*对应的是rmergel,我们先从rmergel查看,如下 ....................................................... split_1(X, Y, [], R, Rs) -> rmergel([[Y, X

jQuery方法源码解析--jQuery($)方法(一)

jQuery方法源码解析--jQuery($)方法 注: 1.本文分析的代码为jQuery.1.11.1版本,在官网上下载未压缩版即可 2.转载请注明出处 jQuery方法: 这个方法大家都不陌生,在使用过程中,它还有另外一个名字,美元符号:$,$(...)其实就是jQuery(...); 它有很多种用法,通常都返回一个jquery对象,也可以作为$(document).ready(...);的简写形式,分析之前先看一下jQuery都有什么用法. 1.jQuery( selector [, co

TreeSet集合的add()方法源码解析(01.Integer自然排序)

>TreeSet集合使用实例 >TreeSet集合的红黑树 存储与取出(图) >TreeSet的add()方法源码     TreeSet集合使用实例 package cn.itcast_05; import java.util.TreeSet; /* * TreeSet:能够对元素按照某种规则进行排序. * 排序有两种方式 * A:自然排序 * B:比较器排序 * * TreeSet集合的特点:排序和唯一 * * 通过观察TreeSet的add()方法,我们知道最终要看TreeMap的

RestTemplate post请求使用map传参 Controller 接收不到值的解决方案 postForObject方法源码解析.md

结论 post方法中如果使用map传参,需要使用MultiValueMap来传递 RestTemplate 的 postForObject 方法有四个参数 String url => 顾名思义 这个参数是请求的url路径 Object request => 请求的body 这个参数需要再controller类用 @RequestBody 注解接收 Class responseType => 接收响应体的类型 第四个参数?postForObject 方法多种重构 Map<String

java常用关键词关键字,方法源码解析

transient volatile native final Integer String Class &&Object newInstance Class.forName,ClassLoader.loadClass ClassLoader .getResources(), ClassLoader.getSystemResources() ClassLoader .getResources(), ClassLoader.getSystemResources() public Enumer

java.lang.Void类源码解析_java - JAVA

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 在一次源码查看ThreadGroup的时候,看到一段代码,为以下: /* * @throws NullPointerException if the parent argument is {@code null} * @throws SecurityException if the current thread cannot create a * thread in the specified thread grou

jquery源码解析:jQuery工具方法Callbacks详解

我们首先来讲下Callbacks是如何使用的:第一个例子 function a(){} function b(){} var cb = $.Callbacks(); cb.add(a); cb.add(b); cb.fire();      //就会先执行a方法,再执行b方法 上面大概的意思是:add方法,就是把方法添加到数组list中,每执行一次,就添加一个方法.而fire方法,就是把list数组中的方法按顺序执行. 使用场景:第二个例子 function a(n){ } (function(

十七.jQuery源码解析之入口方法Sizzle(1)

函数Sizzle(selector,context,results,seed)用于查找与选择器表达式selector匹配的元素集合.该函数是选择器引擎的入口. 函数Sizzle执行的6个关键步骤如下: 1.解析选择器表达式,解析出块表达式和关系符. 2.如果存在位置伪类,则从左向右查找: a.查找第一个块表达式匹配的元素集合,得到第一个上下文元素集合. b.遍历剩余的块表达式和块间关系符,不断缩小上下文元素集合. 3.否则从右向左查找: a.查找最后一个块表达式匹配的元素集合,得到候选集,映射集

多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面大致的了解了Thread的一些方法和属性下面对一些方法进行运用看看具体效果<下面可能还是会贴很多的源代码,其实我是拒绝的,我只想贴每个方法的代码,但是有时候看到一个方法里面有调用了方法,但是笔者有没有给出来,很蛋疼,有种爽到一半的感觉,所以我还是会把它贴出来,希望一次就能挖到底,不论有没有全懂,但至