JavasScript数组的几种常用排序方式

1、冒泡排序

 // 冒泡排序 将数组中相邻的两个元素之间进行大小比较,然后决定是否进行位置交互
        var arr = [5, 4, 2, 3, 8];
        // /*
        //     第一次 5与4比较 交互位置[4,5,2,3,8]
        //     第二次 5与2比较 交换位置[4,2,5,3,8]
        //     第三次 5与3比较 交互位置[4,2,3,5,8]
        //     第四次 5与8比较 不交换 [4,2,3,5,8]
        // */
        // // 当i等于4的时候 使用arr[4]与arr[5]比较 越界   
        // for (var i = 0; i < arr.length - 1; i++) {
        //     // 每次循环arr[i] 表示当前比较的前面的一个元素 arr[i+1] 表示比较的后面一个元素
        //     if (arr[i] > arr[i + 1]) {
        //         // 前面的数字大 需要交换位置
        //         var tmp = arr[i];
        //         arr[i] = arr[i + 1];
        //         arr[i + 1] = tmp;
        //     }
        // }
        // console.log(arr)


        /*
            第一轮
                第一次 5与4比较 交互位置[4,5,2,3,8]
                第二次 5与2比较 交换位置[4,2,5,3,8]
                第三次 5与3比较 交互位置[4,2,3,5,8]
                第四次 5与8比较 不交换 [4,2,3,5,8]
                完成一次所有相邻的元素进行大小比较之后 只能确定一个最大值。所以需要将上面的操作在来几次
            第二轮
                第一次 4与2比较 交换位置 [2,4,3,5,8]
                第二次 4与3比较 交换位置 [2,3,4,5,8]
                第三次 4与5比较 不交换
                完成了第二个最大值的查找
                ....
                轮数 根据数组的元素个数-1
        */
       2

var count = 0;
        for (var j = 0; j < arr.length - 1; j++) {
            // 当j = 0  第一轮比较 需要比较4次
            // 当j = 1 第二轮比较 需要比较3次
            for (var i = 0; i < arr.length - j - 1; i++) {
                count++;
              // 每次循环arr[i] 表示当前比较的前面的一个元素 
                arr[i+1] 表示比较的后面一个元素
                if (arr[i] > arr[i + 1]) {
                    // 前面的数字大 需要交换位置
                    var tmp = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = tmp;
                }
            }
        }
        console.log(arr)
        console.log('一共进行了' + count + '次比较')

2、选择排序


/*
    先假设 第一个元素最小 在使用假设的最小值与后面的每一个元素进行比较
    第一轮 先假设下标为0的元素最小
        第一次 使用5与6比较
        第二次 使用5与3比较 记录现在最小值的小标为2
        第三次 使用3与3比较
        第四次 使用3与1比较 记录现在最小值的小标为3
        第五次 使用1与8比较
        第六次 使用1与7比较
        第七次 使用1与2比较
        第八次 使用1与4比较
        使用下标为0的元素与下标为3的元素位置交互
        [1,6,3,5,8,7,2,4]
    第二轮 先假设下标为1的元素最小
        第一次比较
        。。。。
        最后 找到 下标为6的元素是最小值 使用下标为1的与下标为6的进行交互
        [1,2,3,5,8,7,6,4];
    。。。
*/

var arr = [5, 6, 3, 1, 8, 7, 2, 4];
for (var j = 0; j < arr.length; j++) {
    // j = 0 第一轮 假设下标为0的元素最小
    // j = 1 第二轮 假设下标为1的元素最小。。。。
    // 表示假设的最小值的下标    
    var index = j;
    for (var i = index + 1; i < arr.length; i++) {
        // arr[index]>arr[i]满足比较假设不成立 当前i的元素是最小值
        arr[index] > arr[i] && (index = i)
    }
    var tmp = arr[index];
    arr[index] = arr[j];
    arr[j] = tmp;
}
console.log(arr)

3、数组sort方法排序

语法 数组.sort(匿名函数)  默认是按照字符串的ASCII进行排序
// 匿名函数中存在2个形参 表示比较的两个元素 函数体return a-b 就是从小到大  函数体中return b-a 就是从大到小

arr = [10, 9, 28, 65];
arr.sort(function (a, b) {
    // return a-b
    return b - a
});
console.log(arr) //[65,28,10,9]

4、快速排序

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值