数组的7种排序汇总

实际开发中不是每个都用,只是一种思想呈现。

1、桶排序(桶中出现的数组元素都做个标记1,然后将桶数组中有1标记的元素依次打印)

//简单, 但是不用,浪费内存
var arr2=[];
for(var i=0;i<arr.length;i++){
    var key=arr[i];
    arr2[key]=1;
}
for(var j in arr2){
    console.log(j);
}

2、冒泡排序(每一趟找出最大的)

//性能一般
let arr=[1,5,7,9,16,2,4];
//冒泡排序,每一趟找出最大的,总共比较次数为arr.length-1次,每次的比较次数为arr.length-1次,依次递减
let len = arr.length;
for(let k = 0; k < len - 1; k++) {
    for(let m = 0; m < len - k - 1; m++) {
        if(arr[m] > arr[m+1]){
            let val = arr[m];
            arr[m] = arr[m+1];
            arr[m+1] = val;
        }
    }
}

console.log(arr)

3、选择排序(假定某个位置的值是最小值)

//性能一般
var arr=[1,23,5,8,11,78,45];
let len = arr.length;
for(let k = 0; k < len - 1; k++) {
    for(let m = k + 1; m < len; m++) {
        if(arr[k] > arr[m]){
            let val = arr[m];
            arr[m] = arr[k];
            arr[k] = val;
        }
    }
}

console.log(arr)

4、快速排序(一拆为二)

function quickSort(arr){
    if(arr.length <= 1){
        return arr;
    }
    var left = [];
    var right = [];
    var midIndex = parseInt(arr.length / 2);
    var mid = arr[midIndex];
    for(var i = 0 ; i < arr.length ; i++){
        if(i == midIndex) continue;
        if( arr[i] < mid){
            left.push(arr[i])
        }else{
            right.push(arr[i]);
        }
    }
    return quickSort(left).concat([mid],quickSort(right));
}

[1,2].concat([3],[4,5]);   //[1, 2, 3, 4, 5]

5、插入排序

var arr=[45,1,32,21,56,87,43,12,34,45];
    for(var i=0;i<arr.length;i++){
    var n=i;
    while(arr[n]>arr[n+1] && n>=0){
 	    var temp=arr[n];
	    arr[n]=arr[n+1];
 	    arr[n+1]=temp;
	    n--;
    }
}

6、希尔排序(性能最好的排序)

function xier(arr){
    var interval = parseInt(arr.length / 2);  //分组间隔设置
    while(interval > 0){
        for(var i = 0 ; i < arr.length ; i ++){
            var n = i;
            while(arr[n] < arr[n - interval] && n > 0){
                var temp = arr[n];
                arr[n] = arr[n - interval];
                arr[n - interval] = temp;
                n = n - interval;
            }
        }
        interval = parseInt(interval / 2);
    }
    return arr;
}
xier([12,9,38,44,7,98,35,59,49,88,38]);

7、sort排序

//一维数组排序
var arr=[1,5,7,9,16,2,4];
arr.sort(function(a,b){
    return b-a;  //降序排列,return a-b; —>升序排列
})  //括号里不写回调函数,则默认按照字母逐位升序排列,结果为[1,16,2,4,5,7,9]
//对象数组排序
var arr = [
    {name:'syy',age:0},
    {name:'wxy',age:18},
    {name:'slj',age:8},
    {name:'wj',age:20}
];

function compare(property){
    return function(a,b){
        var value1 = a[property];
        var value2 = b[property];
        return value1 - value2;//升序,降序为value2 - value1
    }
}
arr.sort(compare('age'))

  • 58
    点赞
  • 361
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
reduce方法可以用于对数组进行排序。具体的步骤如下: 1. 首先,使用reduce方法对数组进行遍历,将每个元素传入reduce函数中。 2. 在reduce函数中,比较前一个元素和当前元素的大小关系,根据需要进行交换位置或保持不变。 3. 最后,reduce方法返回一个排序后的数组。 举个例子,假设有一个数组numList = [1, 4, 5, 5, 7, 5, 8, 1, 2, 3, 4, 5, 9, 1, 2]。可以使用reduce方法对该数组进行排序和去重,代码如下: const numList = [1, 4, 5, 5, 7, 5, 8, 1, 2, 3, 4, 5, 9, 1, 2]; let newNumList = numList.sort().reduce((prev, item) => { if (prev.length === 0 || prev[prev.length - 1] !== item) { prev.push(item); } return prev; }, []); console.log(newNumList); 运行以上代码,将会输出排序并去重后的数组。 引用内容: : reduce()方法可以做很多操作,比如对数组元素求和、计算元素出现次数、去重等等。 : reduce()对数组每个元素执行一次由您提供的reduce函数,并将结果汇总为单个返回值。 : 代码示例展示了如何对数组进行排序和去重的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [JS操作数组神器——reduce(求和、出现次数、去重、分类)](https://blog.csdn.net/qq_33591873/article/details/125248005)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值