一、sort排序
sort() 方法用于对数组的元素进行排序,并返回数组。默认排序顺序是根据字符串Unicode码点。
语法:array.sort(fun);
参数fun可选。规定排序顺序。必须是函数。
如果想按照其他规则进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。
比较函数应该具有两个参数 a 和 b,其返回值如下:
若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
若 a 等于b,则返回 0。
若 a 大于 b,则返回一个大于 0 的值。
简单点就是:比较函数两个参数a和b,返回a-b 升序,返回b-a 降序
注: 如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。
1、不传参数,将不会按照数值大小排序,按照字符编码的顺序进行排序。即对数值排序无效。
let arr = ['ccc','ddd','bbbb','eee','aaaa'];
let newArr =arr.sort();
console.log(newArr); // ["aaaa", "bbbb", "ccc", "ddd", "eee"]
let arr0= [30,7,68,100,56];
let newArr0 =arr0.sort();
console.log(newArr0); // [100, 30, 56, 68, 7]
2、传入参数,按升序和降序排列。
升序
let arr1 = [30,7,68,100,56];
let newArr1 =arr1.sort((a,b)=>{
return a-b;
});
console.log(newArr1); // [7, 30, 56, 68, 100]
降序:
let arr2 = [30,7,68,100,56];
let newArr2 =arr1.sort((a,b)=>{
return b-a;
});
console.log(newArr2); // [100, 68, 56, 30, 7]
3、根据数组中的对象的某一个属性值进行排序,单条件排序。
let arr = [
{name:'张三',age:'26'},
{name:'李四',age:'30'},
{name:'小明',age:'18'},
{name:'小红',age:'16'}
];
let newArr = arr.sort((a,b)=>{
return a.age -b.age;
});
console.log(newArr);
// [
// {name:'小红',age:'16'},
// {name:'小明',age:'18'},
// {name:'张三',age:'26'},
// {name:'李四',age:'30'}
// ];
注: 降序同普通数组一样,采用b-a模式。
4、根据数组中的对象的多个属性值排序,多条件排序;
let arr = [
{name:'张三',age:26,id:0},
{name:'李四',age:30,id:1},
{name:'小明',age:18,id:10},
{name:'小红',age:16,id:100},
{name:'王五',age:16,id:10}
];
let newArr = arr.sort((a,b)=>{
if(a.id === b.id){
return a.age -b.age;
}else{
return a.id - b.id;
}
});
console.log(newArr);
// [
// {name:'张三',age:26,id:0},
// {name:'李四',age:30,id:1},
// {name:'王五',age:16,id:10}
// {name:'小明',age:18,id:10},
// {name:'小红',age:16,id:100},
// ]
二、冒泡排序
通过相邻两个元素之间的比较和交换,使较大的元素逐渐从前面移向后面(升序),就像水底下的气泡一样逐渐向上冒泡,所以被称为“冒泡”排序。
let arrNum = [2, 5, 4, 1, 3];
function sortFun(arr) {
let temp = null;
for (let i = 0; i < arr.length - 1; i++) {
for (let j = i + 1; j < arr.length; j++) {
//如果前面的数据比后面的大就交换,两个数交换一定要声明一个变量,用来存储其中要被赋值的那个
if (arr[i] > arr[j]) {
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
return arr;
}
let newArr = sortFun(arrNum);
console.log(newArr); // [1, 2, 3, 4, 5]
三、快速排序法
元素的比较和交换是从两端向中间进行的,较大的元素一轮就能够交换到后面的位置,而较小的元素一轮就能交换到前面的位置,元素每次移动的距离较远,所以比较次数和移动次数较少,速度较快,故称为“快速排序”。
let arrNum = [2, 5, 1, 4, 3, 6];
function sortFun(arr) {
// 判断数组长度是否小于等于1,如是直接返回
if (arr.length <= 1) {
return arr;
}
let arrIndex = Math.floor(arr.length / 2);//获取中间值下标,索引
let arrCenterVal = arr.splice(arrIndex, 1);//根据索引获取中间值
let minVal = [];//比中间值小的值
let maxVal = [];//比中间值大的值
for(let i=0;i<arr.length;i++){
if(arr[i]<arrCenterVal){
minVal.push(arr[i]);
}else{
maxVal.push(arr[i]);
}
}
//递归,对minVal、maxVal两个数组进行操作,直到数组长度为<=1;
return sortFun(minVal).concat(arrCenterVal,sortFun(maxVal))
}
let newArr = sortFun(arrNum);
console.log(newArr); // [1, 2, 3, 4, 5, 6]