JavaScript 浅谈选择法排序和冒泡排序的区别与优缺点

案例引入

为什么会写这篇博客呢?因为我在初学选择法排序和冒泡排序之后做的练习中混淆了二者。
具体代码如下:

  • 要求:利用选择法排序将数组[45,78,21,30,89,76]从小到大排序
// 选择法排序

var arr = [45,78,21,30,89,76]

for(var i = 0;i<arr.length;i++){          //外循环控制趟数
    var min = arr[i]                      //假定最小值用于比较

    for(var j = i+1;j<=arr.length;j++){  //j=i+1使其从剩余元素中进行筛查        //从剩余数字中寻找最小值
        if(min > arr[j]){
            min = arr[j]                 //更新最小值
            var temp = arr[j]            //交换a[j]和a[i]
            arr[j] = arr[i]
            arr[i] = temp 
        }
    }

}
console.log(arr)

接下来我们先学习冒泡排序和选择法排序,学习完成后再来分析这个案例。

冒泡法

实现原理

  • 原理:每一次排序过程,通过相邻元素的交换,将当前没有排好序中的最大(小)移到数组的最右(左)端。
  • 如图所示: 动态图(图源博客

代码演示

// 冒泡排序
var arr = [45,78,21,30,89,76]
var i = 0;
for(j = 0;j<arr.length;j++){
    for(i = 0;i<arr.length-1;i++){
        if(arr[i] > arr[i+1]){
            var temp = arr[i]
            arr[i] = arr[i+1]
            arr[i+1] = temp
        }
    }
}
console.log(arr)

代码解析

  1. 外循环:控制循环趟数,即要进行几次大循环(找出一个最大值算一个大循环)。
  2. 内循环:控制每趟需要比较的次数
  3. if语句:进行相邻数字的比较和交换,最终将当前数组的最大值“冒出去”。
  4. 关键点:两两比较,即时交换

选择法

实现原理

  • 原理:每一次排序过程,我们获取当前没有排好序中的最大(小)的元素和数组最右(左)端的元素交换,循环这个过程即可实现对整个数组排序。
  • 如图所示: 动态图(图源博客

代码演示

//选择法排序
var arr = [45,78,21,30,89,76]
for(var i = 0;i<=arr.length;i++){
    var min = arr[i]
    var k = i;
    for(var j = i+1;j<arr.length;j++){
        if(min > arr[j]){
            min = arr[j]
            k = j;
        }
    }
    if(k!=i){
        var temp = arr[k]
        arr[k] = arr[i]
        arr[i] = temp 
    }
}
console.log(arr)

代码解析

  1. 外循环:控制循环趟数,即要进行几次大循环(找出一个最小值算一个大循环)。
  2. 内循环:控制每趟需要比较的次数
  3. 第一条if语句:比较当前最小值和其他所有元素,记录最终的最小值。
  4. 第二条if语句:比较最小值和当前位置的数字,并决定是否交换,进入下一轮外循环。
  5. 关键点:先找最值,一次交换

案例分析

现在我们已经了解了冒泡排序和选择法排序,我们再回过头来分析一下一开始提到的案例:

  • 要求:利用选择法排序将数组[45,78,21,30,89,76]从小到大排序
// 选择法排序

var arr = [45,78,21,30,89,76]

for(var i = 0;i<arr.length;i++){          //外循环控制趟数
    var min = arr[i]                      //假定最小值用于比较

    for(var j = i+1;j<=arr.length;j++){  //j=i+1使其从剩余元素中进行筛查        //从剩余数字中寻找最小值
        if(min > arr[j]){
            min = arr[j]                 //更新最小值
            var temp = arr[j]            //交换a[j]和a[i]
            arr[j] = arr[i]
            arr[i] = temp 
        }
    }

}
console.log(arr)
  • 乍一看这段代码,好像是选择法排序:设置最小值,在当前位置更新最小值。
  • 但是再一看,发现这段代码在每次比较成功后就会进行交换,并不是选择法排序的“先找最值,一次交换”。
  • 那么它是什么呢?我认为这是一种变形的冒泡排序。
  • 虽然不是相邻元素的比较和交换,但它是“两两交换,及时执行”,我认为是一种变形的冒泡排序。

冒泡法和选择法的区别与优缺点

区别

  • 冒泡排序:两两比较,即时交换。
  • 选择法排序:先找最值,一次交换。

优缺点

  • 冒泡排序:实现起来简单,如果待排序数据量小,并且对效率要求不高时,完全可以满足。
  • 选择排序:交换次数较少,一定程度上提高了运算效率。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值