JavaScript与C++中的排序函数

我心飞翔 分类:javascript

非常零碎的知识点,但今天遇到、想到,顺便记录下

一、Javascript: Array.prototype.sort()

  • 原地排序
  • 默认升序排序
  • 排序规则:按 字符编码 顺序 排序
  1. 特别强调字符编码和顺序,这两个规则决定了排序结果

    image.png

    'A'、'B'、'C'字符编码分别为 65, 66, 67, 所以排序结果为 ['A', 'B', 'C']

  2. 再看一组例子,表明了顺序的重要性

    image.png

    数组元素中“A”字符编码最小,所以“AC”,“AB”会排在“BC”前面,这时需要比较“AC”,“AB”的大小。顺序可以理解成字符编码的大小顺序,也可理解成数组元素中的字符顺序

    此例中,“AC”,“AB”的第一个字符编码大小相等,故开始比较下一个字符的大小,“B”的编码小于“C”,所以“AB”应该排在“AC”前面

  3. 数字元素会先被转换成字符串,再比较字符串的Unicode值别再傻傻的对数字进行排序了

    image.png

    转换成字符串之后参照 1、2 两点,就很好理解这个结果了,因为1的Unicode值最小,所以排在前面,9的Unicode值最大,即使80远远大于9,还是会被排在9前面

  4. 自定义排序规则

    Array.prototype.sort(cmp): cmp是自定义排序规则的函数,返回一个数值表示这两个值的相对顺序

    function cmp(a, b) {
        return a - b;
    }
     
    • 返回小于0的数,表示排序后的数组中a出现在b之前(升序)

    • 返回 0, a ,b位置不变

    • 返回大于0的数,表示排序后的数组中b出现在a之前(降序)

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;
}

 

二、C++: sort()

  • 原地排序
  • 默认升序排序
  • 支持的容器: array、vector、deque
  • 降序排序:sort(nums.begin(), nums.end(), greater<int>());
  1. 自定义排序规则

    C++的排序规则函数返回的是一个boolean,这一点与Javascript不同

bool cmp(int &x, int &y) {
    return x < y;
}

sort(nums.begin(), nums.end(), cmp); 

 

小结

Javascript最容易掉坑,不是一sort()就完事的,排序规则是字符的Unicode数值顺序,自定义比较函数返回的数值,返回boolean是无效的

C++ 部分东西有点多,后续补吧~·

回复

我来回复
  • 暂无回复内容