目录
1、使用 sort() 和 reverse() 方法对数组排序
前言
排序都是根据 ASCII 码排的,关于 ASCII 请戳这里:键盘码(ASCII码 和 Unicode字符编码表)_青蛙king的博客-CSDN博客
一、数组排序方式
1、使用 sort() 和 reverse() 方法对数组排序
var a = [1,"c",3,"d",6,0];
a.sort();
console.log(a); // [0, 1, 3, 6, "c", "d"]
如果想按照从大到小的顺序排序,可以在用 sort() 方法之后,接着用一下 reverse() 方法:
var a = [1,"c",3,"d",6,0];
a.sort().reverse();
console.log(a); // ["d", "c", 6, 3, 1, 0]
2、选择排序
每一轮比较时,会用数组中的一个基准值和后面的数依次做比较,如果基准值大于后面某个数,就交换每一轮比较后得到最小值。
function fn(arr){
for(var i=0; i<arr.length-1; i++){
for(var j=i+1; j<arr.length; j++){
if(arr[i] > arr[j]){
var t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
}
return arr;
}
var arr = [1,3,6,4,2,5];
console.log(fn(arr)); // [1, 2, 3, 4, 5, 6]
计算过程:
arr = [1,3,2,6,5,4] length=arr.length = 6
i(i<length-1) | j(j=i+1 && j<length) | 比较 | 结果 | 描述 | ||
---|---|---|---|---|---|---|
i<5 | 0 | j<6 | 1 | 1<3 | [1,3,2,6,5,4] | j循环体,第一次循环结束,确定最小值 1。 继续序列化。 |
2 | 1<2 | [1,3,2,6,5,4] | ||||
3 | 1<6 | [1,3,2,6,5,4] | ||||
4 | 1<5 | [1,3,2,6,5,4] | ||||
5 | 1<4 | [1,3,2,6,5,4] | ||||
1 | j<6 | 2 | 3>2 | [1,2,3,6,5,4] | j循环体,第二次循环结束,确定第二小的值 2。 继续序列化。 | |
3 | 2<6 | [1,2,3,6,5,4] | ||||
4 | 2<5 | [1,2,3,6,5,4] | ||||
5 | 2<4 | [1,2,3,6,5,4] | ||||
2 | j<6 | 3 | 3<6 | [1,2,3,6,5,4] | j循环体,第二次循环结束,确定第三小的值 3。 继续序列化。 | |
4 | 3<5 | [1,2,3,6,5,4] | ||||
5 | 3<4 | [1,2,3,6,5,4] | ||||
3 | j<6 | 4 | 6>5 | [1,2,3,5,6,4] | j循环体,第二次循环结束,确定第四小的值 4。 继续序列化。 | |
5 | 5>4 | [1,2,3,4,6,5] | ||||
4 | j<6 | 5 | 6>5 | [1,2,3,4,5,6] | j循环体,第二次循环结束,确定第五小的值 5。 序列化完成。 两个循环体都结束。 |
3、冒泡排序
每相邻两个元素大小作比较,不合适,则交换。
function fn(arr){
for(var i=0; i<arr.length-1; i++){
for(var j=0; j<arr.length-i-1; j++){
if(arr[j] > arr[j+1]){
var t = arr[j];
arr[j] = arr[j+1];
arr[j+1] = t;
}
}
}
return arr;
}
var arr = [1,3,2,6,5,4];
console.log(fn(arr)); // [1, 2, 3, 4, 5, 6]
计算过程:
arr = [1,3,2,6,5,4] length=arr.length = 6
i(i<length-1) | j(j<length-i-1) | 比较 | 结果 | 描述 | ||
---|---|---|---|---|---|---|
i<5 | 0 | j<5 | 0 | 1<3 | [1,3,2,6,5,4] | j循环体,第一次循环结束后 继续序列化。 |
1 | 3>2 | [1,2,3,6,5,4] | ||||
2 | 3<6 | [1,2,3,6,5,4] | ||||
3 | 6>5 | [1,2,3,5,6,4] | ||||
4 | 6>4 | [1,2,3,5,4,6] | ||||
1 | j<4 | 0 | 1<2 | [1,2,3,5,4,6] | j循环体,第二次循环结束后锁定了第二大的值 5。 序列化完成。 循环还在继续。 | |
1 | 2<3 | [1,2,3,5,4,6] | ||||
2 | 3<5 | [1,2,3,5,4,6] | ||||
3 | 5>4 | [1,2,3,4,5,6] | ||||
. | . . . | . . . | . . . | . | 直至循环结束。 |
二、排序题
1、将根据排序函数比较数组中每个元素的大小排序
(1)、从小到大排序
function f(a,b) {
return (a - b);
}
var a = [3,1,2,4,5,7,6,8,0,9];
a.sort(f);
console.log(a); // [0,1,2,3,4,5,6,4,7,8,9]
(2)、从大到小排序
function f(a,b) {
return (b - a);
}
var a = [3,1,2,4,5,7,6,8,0,9];
a.sort(f);
console.log(a); // [9,8,7,6,5,4,3,2,1,0]
2、根据奇偶性质排列数组
function f(a, b) {
var a = a % 2,
b = b % 2;
if (a == 0) return 1; //如果参数a为偶数,则排在左边
if (b == 0) return -1; //如果参数b为偶数,则排在右边
}
var a = [3,1,2,4,5,7,6,8,0,9];
a.sort(f); //根据数字大小由大到小进行排序
console.log(a); // [3,1,5,7,9,0,8,6,4,2]
3、不区分大小写排序字符串
在正常情况下,对字符串进行排序是区分大小写的,这是因为每个大写字母和小写字母在字符编码表中的顺序是不同的,大写字母大于小写字母。
var a = ["aB", "Ab", "Ba", "bA"];
a.sort();
console.log(a); // ["Ab", "Ba", "aB", "bA"]
大写字母总是排在左侧,如果让小写字母总是排在左侧,可以设计:
function f(a,b) {
return (a < b);
}
var a = ["aB", "Ab", "Ba", "bA"];
a.sort();
console.log(a); // ["Ab", "Ba", "aB", "bA"]
如果不区分大小写,大写字母和小写字母按相同顺序排列,可以设计:
function f(a, b) {
var a = a.toLowerCase;
var b = b.toLowerCase;
if (a < b) {
return 1;
}
else {
return -1;
}
}
var a = ["aB", "Ab", "Ba", "bA"];
a.sort();
console.log(a); // ["aB", "Ab", "Ba", "bA"]
4、把浮点数和整数分开显示
function f(a, b) {
if (a > Math.floor(a)) return 1; //如果a是浮点数,则调换位置
if (b > Math.floor(b)) return -1; //如果b是浮点数,则调换位置
}
var a = [3.5555, 1.23456, 3, 2.11111, 5, 7, 3];
a.sort(f);
console.log(a); // [3,5,7,3,2.11111,1.23456,3.55555]
5、按照数组的每一项的 id 值对数组进行从小到大的排序
let arr = [
{id: 1, str: 'aa'},
{id: 4, str: 'dd'},
{id: 2, str: 'bb'},
{id: 3, str: 'cc'}
]
arr.sort((a, b) => {
return (a.id + '') > (b.id + '') ? 1 : -1
})
/*
[
{id: 1, str: 'aa'},
{id: 2, str: 'bb'},
{id: 3, str: 'cc'}
{id: 4, str: 'dd'},
]
*/