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++实现的方法

定义选择排序函数

调用

自定义类型

阅读 4.3k
4 个回答
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)=>{
  let v1 = values(a)
  let v2 = values(b)
  if(v1>v2){
    return 1
  }
})

console.log(arr)

如果能修改对象的形式,这样能容易很多

[{name:'D',score: 90 }, { name:'A',score: 20 }, { name:'B','score': 50 }, { name:'C','score': 10 }].sort((a,b)=>{return a.score-b.score})

学到了,借鉴楼上的Object.keys()方法

[{ 'D': 90 }, { 'A': 20 }, { 'B': 50 }, { 'C': 10 }].sort((a,b)=>{return a[Object.keys(a)]-b[Object.keys(b)]})

先说答案: 有可能。但是需要调用者传入更多的信息。
先来分析一下排序需要指导哪些信息:

  1. 比较 campare: 怎么去比较元素的大小
  2. 交换 swap :怎么来交换俩个元素的位置
  3. 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这个接口,这个接口中有我前面提到的三个函数。

function px(array, Fn) {
    array = Fn(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;
}

function values(o) {
    return Object.keys(o).map(
        function(k) {
            return o[k]
        })
}
let array = [{ D: 90 }, { A: 20 }, { B: 50 }, { C: 10 }];
let item = px(array, (arr) => {
    for (let i = 0; i < arr.length; i++) {
        arr[i] = values(arr[i])[0];
    }
    return array;
});
console.log(item);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题