猿问

JS选择排序

写了一个选择排序的函数,正常的传入数字或者字母都是可以的,但是有没有可能改我自定义类型的?


这是我的选择排序函数。

function px(array) {

    for (let i = 0; i < array.length; i++) {

        let minIndex = i;

        for (let j = i + 1; j < array.length; j++) {

            if (array[j] < array[minIndex]) {

                minIndex = j;

            }

        }

        [array[minIndex], array[i]] = [array[i], array[minIndex]]

    }

    return array;

}

假设现在我希望传入一组学生的信息,来进行排序

[{ 'D': 90 }, { 'A': 20 }, { 'B': 50 }, { 'C': 10 }]

希望输出

[{ 'C': 10 }, { 'A': 20 }, { 'B': 50 }, { 'D': 90 }]


我想像这样改成一个自定义类型的,我应该怎么做,如何自定义这个类型~


附上C++实现的方法

https://img1.mukewang.com/5c74dc430001499208000131.jpg

https://img1.mukewang.com/5c74dc440001ed5f08000479.jpg

守候你守候我
浏览 821回答 2
2回答

呼如林

var arr = [{ 'D': 90 }, { 'A': 20 }, { 'B': 50 }, { 'C': 10 }]function values(o) { return Object.keys(o).map(function(k){return o[k]}) }arr = arr.sort((a,b)=>{&nbsp; let v1 = values(a)&nbsp; let v2 = values(b)&nbsp; if(v1>v2){&nbsp; &nbsp; return 1&nbsp; }})console.log(arr)

aluckdog

先说答案: 有可能。但是需要调用者传入更多的信息。先来分析一下排序需要指导哪些信息:比较 campare: 怎么去比较元素的大小交换 swap :怎么来交换俩个元素的位置list的长度 len :怎么获取list的长度我们看一下v8引擎给我们提供的接口,Array.prototype.sort():sort() 方法在适当的位置对数组的元素进行排序,并返回数组。 sort 排序不一定是稳定的。默认排序顺序是根据字符串Unicode码点。arr.sort() arr.sort(compareFunction)这个接口要求我们传入一个compareFunction。也就是我前面所说的campare,那么swap和len呢?因为是对数组进行排序,那么Array这个类型信息中已经包含了这俩个function,swap 就是直接交换。 len 就是 Array.length。所以你可以模仿这这个接口完成你自己的排序功能,进行比较的时候,调用函数传入的campare function 而不是 '<'或者 '>'。那么问题你的问题就解决了。排序函数的调用者每次为自己的类型多写一个campare function 就可以复用 这个排序函数。看一下你给出来的c++的例子,运算符重载'<',不正是传进去的那个campare function 吗? 只是语言的语法不同导致的表达方式的不同而已,所需要的信息从来没有变过。既然说到了这里,就展开来说一下len, 和 swap 怎么使用。 前面我们所讲的都是多数组进行排序。我想为自己写的一个链表进行排序,怎么办呢? 那么你再传入len, swap 就可以了len 获取长度,swap 交换元素。我们的排序函数就能更好的复用了。当然了这样写的话就会显得又臭又长,而且js中我们一般也不会自己去写一个链表,Array可以当链表用。开拓一下眼界,看看在别的语言是怎么做的。在java中因为有接口这一语法,所以就让你实现comparable 这个接口,这个接口中有什么函数呢?就一个campareTo;golang中 让你去实现sort.Interface这个接口,这个接口中有我前面提到的三个函数。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答