JavaScript中数组排序的几种常用写法

326 阅读2分钟

(一)sort排序(最常用)

//数组中只有个位数时:
let ary = [1,4,4,2,6,1]
ary.sort()
console.log(ary) //[1, 1, 2, 4, 4, 6]

//错误示例:
let ary1 = [10,4,17,6,26,33]
ary1.sort()
console.log(ary1)  //[10, 17, 26, 33, 4, 6],因为sort只对第一个数进行比较,所以数组中若有多位数时,要用下面这种方法

//数组中为多位数时:
let ary2 = [10,4,17,6,26,33]
ary2.sort(function(a,b){
	return a-b; //(a-b)为升序,(b-a)为降序
}) //可以简写为:ary2.sort((a,b) => a-b)
console.log(ary2) //[4, 6, 10, 17, 26, 33]

(二)冒泡排序(让数组中的当前项和后一项进行比较,如果当前项比后一项大,则两项交换位置(让大的靠后)即可)

        /* 
        bubble:实现冒泡排序
            参数:ary[ARRAY] 需要排序的数组
            返回值:[ARRAY]排序后的新数组
         */
         function bubble(ary){
             let temp = null;
             //外层循环I控制比较的轮数
             for(let i = 0;i<ary.length-1;i++){
                //里层循环控制每一轮比较的次数J
                for(let j = 0;j<ary.length-1-i;j++){
                    if(ary[j] > ary[j+1]){
                        //当前项大于后一项
                        temp = ary[j];
                        ary[j] = ary[j+1];
                        ary[j+1] = temp;
                    }
                }
             }
             return ary;
         }
         let ary = [12,8,24,16,1];
         ary = bubble(ary);
         console.log(ary); //[1, 8, 12, 16, 24]

(三)插入排序

		/* 
        insert:实现插入排序
            参数:ary[ARRAY]需要排序的数组
            返回值:[ARRAY]排序后的新数组
         */
        function insert(ary){
            //1.准备一个新数组,用来存储第一个数据
            let handle = [];
            handle.push(ary[0]);
            //2.从第二项开始直到最后
            for(let i = 1;i<ary.length;i++){
                let A = ary[i]; //A为新获取的数据
                //从后向前比
                for(let j = handle.length-1;j >= 0;j--){
                    let B = handle[j]; //B为每一次要比较的数据
                    if(A > B){
                        handle.splice(j+1,0,A);
                        break;
                    }
                    //已经比到第一项,我们把该数据放到最前面即可
                    if(j===0){
                        handle.unshift(A);
                    }
                }
            }
            return handle;
        }
        let ary = [12,8,24,16,1];
        ary = insert(ary);
        console.log(ary); //[1, 8, 12, 16, 24]

(四)快速排序

		/* 
        quick:实现快速排序
            参数:ary[ARRAY]需要排序的数组
            返回值:[ARRAY]排序后的新数组
        */
        function quick(ary){
            //4.结束递归(当ARY中小于等于一项,则不用处理)
            if(ary.length <= 1){
                return ary;
            }
            //1.找到数组的中间项,在原有的数组中把他移除
            let middleIndex = Math.floor(ary.length/2);
            let middleValue = ary.splice(middleIndex,1)[0];

            //2.准备左右两个数组,循环剩下数组中的每一项,比当前项小的放在左边数组中,反之放在右边数组中
            let aryLeft = [],
                aryRight = [];
            for(let i = 0;i<ary.length;i++){
                let item = ary[i];
                item < middleValue ? aryLeft.push(item) : aryRight.push(item);
            }
            //3.递归方式让左右两边的数组持续这样处理,一直到左右两边都排好序为止(最后让左边+中间+右边拼接成为最后的结果)
            return quick(aryLeft).concat(middleValue,quick(aryRight));
        }
        let ary = [12,8,24,16,1];
        ary = quick(ary);
        console.log(ary); //[1, 8, 12, 16, 24]
        //递归:函数执行的时候自己调用自己