非常零碎的知识点,但今天遇到、想到,顺便记录下
一、Javascript: Array.prototype.sort()
- 原地排序
- 默认升序排序
- 排序规则:按 字符编码 顺序 排序
-
特别强调字符编码和顺序,这两个规则决定了排序结果
'A'、'B'、'C'字符编码分别为 65, 66, 67, 所以排序结果为['A', 'B', 'C'] -
再看一组例子,表明了顺序的重要性
数组元素中“A”字符编码最小,所以“AC”,“AB”会排在“BC”前面,这时需要比较“AC”,“AB”的大小。
顺序可以理解成字符编码的大小顺序,也可理解成数组元素中的字符顺序此例中,“AC”,“AB”的第一个字符编码大小相等,故开始比较下一个字符的大小,“B”的编码小于“C”,所以“AB”应该排在“AC”前面
-
数字元素会先被转换成字符串,再比较字符串的Unicode值(别再傻傻的对数字进行排序了)转换成字符串之后参照 1、2 两点,就很好理解这个结果了,因为1的Unicode值最小,所以排在前面,9的Unicode值最大,即使80远远大于9,还是会被排在9前面
-
自定义排序规则
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>());
-
自定义排序规则
C++的排序规则函数返回的是一个boolean,这一点与Javascript不同
bool cmp(int &x, int &y) {
return x < y;
}
sort(nums.begin(), nums.end(), cmp);
小结
Javascript最容易掉坑,不是一sort()就完事的,排序规则是字符的Unicode数值顺序,自定义比较函数返回的数值,返回boolean是无效的
C++ 部分东西有点多,后续补吧~·