js --- 冒泡排序和选择排序

本文详细介绍了两种常见的排序算法——冒泡排序和选择排序。冒泡排序通过相邻元素的比较和交换逐步将大的元素推后,直至完全排序。选择排序则在每一轮中寻找最小值并将其放置在正确的位置,逐步完成排序。文中通过实例代码展示了这两种排序算法的实现过程,并逐步简化了代码,便于理解。
摘要由CSDN通过智能技术生成

冒泡排序:是一种排序思想,主要目的就是对数组中的元素进行从大到小或者从小到大的排序

        思想:用相邻的2个元素做比较,把大的元素往后放,经过多轮比较之后,一定可以排好序

    var arr = [10, 4, 7, 9, 20, 8, -1, 100, 90, 50]
//===========第一轮比较
    // 1
    if (arr[0] > arr[1]) {
        var temp = arr[0]
        arr[0] = arr[1]
        arr[1] = temp
    }
    console.log(arr);
    // 2
    if (arr[1] > arr[2]) {
        var temp = arr[1]
        arr[1] = arr[2]
        arr[2] = temp
    }
    console.log(arr);
    // 3
    if (arr[2] > arr[3]) {
        var temp = arr[2]
        arr[2] = arr[3]
        arr[3] = temp
    }
    console.log(arr);
    // 4
    if (arr[3] > arr[4]) {
        var temp = arr[3]
        arr[3] = arr[4]
        arr[4] = temp
    }
    console.log(arr);
    // 5
    if (arr[4] > arr[5]) {
        var temp = arr[4]
        arr[4] = arr[5]
        arr[5] = temp
    }
    console.log(arr);
   /* =========================简化第一轮比较的代码  
    第一轮比较的次数刚好是数组的长度-1,所以就可以写小于等于length-2或者小于length-1
    循环的起始值:应该写0,因为第一轮比较是要拿下标0和下标1比较
    一定要记住数组中的下标是从0开始*/
    for (var i = 0; i < arr.length-1; i++) {
        console.log(i);
        // 分析[]中数据规律
        // 0 1
        // 1 2
        // 2 3
        // 3 4
        // 4 5
        if (arr[i] > arr[i + 1]) {
            var temp = arr[i]
            arr[i] = arr[i + 1]
            arr[i + 1] = temp
        }
    }
    console.log(arr);
   // ======================第二轮比较
    // 1
    if (arr[0] > arr[1]) {
        var temp = arr[0]
        arr[0] = arr[1]
        arr[1] = temp
    }
    // 2
    if (arr[1] > arr[2]) {
        var temp = arr[1]
        arr[1] = arr[2]
        arr[2] = temp
    }
    // 3
    if (arr[2] > arr[3]) {
        var temp = arr[2]
        arr[2] = arr[3]
        arr[3] = temp
    }
    // 4
    if (arr[3] > arr[4]) {
        var temp = arr[3]
        arr[3] = arr[4]
        arr[4] = temp
    }
    console.log(arr);
   // ======================简化第二轮比较的代码
    for (var i = 0; i < arr.length - 2; i++) {
        if (arr[i] > arr[i + 1]) {
            var temp = arr[i]
            arr[i] = arr[i + 1]
            arr[i + 1] = temp
        }
    }
    console.log(arr);
   // ====================开始第三轮比较  第三轮 比较只需要拿前面4个数字作比较即可
   // 也就是拿下标0和1  1和2  2和3比即可  只需要比3次即可
    for (var i = 0; i < arr.length - 3; i++) {
        if (arr[i] > arr[i + 1]) {
            var temp = arr[i]
            arr[i] = arr[i + 1]
            arr[i + 1] = temp
        }
    }
    console.log(arr);
    //=====================开始第四轮比较  第四轮只需要拿前面剩余的3个数字作比较即可
    //也就是拿下标0和1比  1和2比较  只需要比较2次即可
    for (var i = 0; i < arr.length - 4; i++) {
        if (arr[i] > arr[i + 1]) {
            var temp = arr[i]
            arr[i] = arr[i + 1]
            arr[i + 1] = temp
        }
    }
    console.log(arr);
    //================开始第五轮比较  第五轮比较只需要拿剩余的前2个数字做比较即可
    //也就是拿下标0和1比较  比1次就可以了
    for (var i = 0; i < arr.length - 5; i++) {
        if (arr[i] > arr[i + 1]) {
            var temp = arr[i]
            arr[i] = arr[i + 1]
            arr[i + 1] = temp
        }
    }
    console.log(arr);

简化版本

    var arr = [10, 4, 7, 9, 20, 8, -1, 100, 90, 50]
    // 外层循环思考:比较多少轮  数组的长度-1
    // 内层循环中:小于的规律:arr.length-j-1
    for (var j = 0; j < arr.length - 1; j++) {
        for (var i = 0; i < arr.length - j - 1; i++) {
            if (arr[i] > arr[i + 1]) {
                var temp = arr[i]
                arr[i] = arr[i + 1]
                arr[i + 1] = temp
            }
        }
    }
    console.log(arr);

选择排序:把关注点放到索引上

        比如要想进行从小到大的排序,那么最终索引0的位置应该存放的是数组中的最小值,依次类推

        思想:

            首先需要在数组中先找出最小数据的索引,定义一个变量minIndex用来准们存储最小数据的索引

            经过一轮比较之后,一定可以找出最小数据的索引,已知最小数据应该要放在索引0的位置

            这时候就把最小数和索引0位置的数据进行交换,这样第一轮结束后索引0的位置存储的一定是最小值

            下一次再从剩余的数当中再次找最小值的索引,找到之后把这个数放到索引1的位置

            依次类推

        找最小数的索引的逻辑

            第一轮:

                1.先假设索引0就是最小数,先假设minIndex = 0

                2.让minIndex的数据和数组中的数据挨个比较(遍历)

                    从几开始遍历:从1开始,

                3.如果minIndex中的数据是大于数组中的数据的,就证明此时数组的这个下标应该是比较小的

                    我们应该让这个下标重新存储到minIndex上

            第二轮的比较:第一个数就不用再参与比较,因为已经确定好了

                所以直接拿后面的数字开始比较即可,要从后面的数字中再次找出最小数的索引

                后面数的下标:1 2 3 4 5

                1.先假设索引1就是最小数minIndex = 1

                2.让minIndex的数据和数组中后面的数挨个作比较

                    从几开始遍历

            第三轮.......

    //    第一轮比较==========================
    var arr = [9, 8, 10, 5, 6, 4]
    var minIndex = 0
    for (var i = 1; i < arr.length; i++) {
        if (arr[minIndex] > arr[i]) {
            minIndex = i
        }
    }
    console.log(minIndex);
    // 要把最小数放到下标0的位置,也就是让[minIndex]对应的数据和[0]对应的数据做个交换
    var temp = arr[minIndex]
    arr[minIndex] = arr[0]
    arr[0] = temp
    console.log('第一轮结束:', arr);

    // 第二轮===================
    var minIndex = 1
    for (var i = 2; i < arr.length; i++) {
        if (arr[minIndex] > arr[i]) {
            minIndex = i
        }
    }
    console.log(minIndex);
    // 第二轮需要把minIndex的数据挪到下标1的位置,也就是让[minIndex]对应的数据和[1]对应的数据做个交换
    var temp = arr[minIndex]
    arr[minIndex] = arr[1]
    arr[1] = temp
    console.log('第二轮结束:', arr);
    // 第三轮=========================
    var minIndex = 2
    for (var i = 3; i < arr.length; i++) {
        if (arr[minIndex] > arr[i]) {
            minIndex = i
        }
    }
    console.log(minIndex);
     // 第二轮需要把minIndex的数据挪到下标2的位置,也就是让[minIndex]对应的数据和[2]对应的数据做个交换
     var temp = arr[minIndex]
    arr[minIndex] = arr[2]
    arr[2] = temp
    console.log('第三轮结束:', arr);
    // 第四轮=========================
    var minIndex = 3
    for (var i = 4; i < arr.length; i++) {
        if (arr[minIndex] > arr[i]) {
            minIndex = i
        }
    }
    console.log(minIndex);
      // 第四轮需要把minIndex的数据挪到下标3的位置,也就是让[minIndex]对应的数据和[3]对应的数据做个交换
      var temp = arr[minIndex]
    arr[minIndex] = arr[3]
    arr[3] = temp
    console.log('第四轮结束:', arr);

    // 第五轮=========================
    var minIndex = 4
    for (var i = 5; i < arr.length; i++) {
        if (arr[minIndex] > arr[i]) {
            minIndex = i
        }
    }
    console.log(minIndex);
     // 第五轮需要把minIndex的数据挪到下标4的位置,也就是让[minIndex]对应的数据和[4]对应的数据做个交换
     var temp = arr[minIndex]
    arr[minIndex] = arr[4]
    arr[4] = temp
    console.log('第五轮结束:', arr);

简化版本

    var arr = [9, 8, 10, 5, 6, 4]
    for (var j = 0; j < arr.length - 1; j++) {//j = 0 1 2 3 4   j<6-1(5)
        var minIndex = j //0 1 2 3 4
        for (var i = j + 1; i < arr.length; i++) {//i = 1 2 3 4 5
            if (arr[minIndex] > arr[i]) {
                minIndex = i
            }
        }
        var temp = arr[minIndex]
        arr[minIndex] = arr[j]//0  1 2 3 4
        arr[j] = temp

    }
    console.log('结束:', arr);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值