js排序

一、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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值