前端面试题之js实现数组冒泡排序与选择排序

在对数组内的元素进行从小到大或从大到小排序时,使用数组方法sort可以很简单的实现,但是在面试时,面试官很喜欢对冒泡排序及选择排序进行提问,下面我们来了解一下冒泡排序与选择排序:

冒泡排序

先准备一个乱序的数组:

var arr = [3, 1, 5, 6, 4, 9, 7, 2, 8]

思路

1、先遍历数组,让相邻的两个进行比较,如果前一个比后一个大,那么就把两个换个位置

for (var i = 0; i < arr.length; i++) {
  // 判断,如果数组中的当前一个比后一个大,那么两个交换一下位置
  if (arr[i] > arr[i + 1]) {
    var tmp = arr[i]
    arr[i] = arr[i + 1]
    arr[i + 1] = tmp
  }
}

2、数组遍历一遍以后,那么最后一个数字就是最大的那个了,遍历完毕以后,数组就会变成 [3, 1, 5, 6, 4, 7, 2, 8, 9]

3、然后我们把上面的这段代码执行多次。按照数组的长度来遍历多少次

for (var j = 0; j < arr.length; j++) {
  for (var i = 0; i < arr.length; i++) {
    // 判断,如果数组中的当前一个比后一个大,那么两个交换一下位置
    if (arr[i] > arr[i + 1]) {
      var tmp = arr[i]
      arr[i] = arr[i + 1]
      arr[i + 1] = tmp
    }
  }
}

4、以此类推,最后就会按照顺序把数组排好了[1,2,3,4,5,6,7,8,9]

代码优化

1、想象一个问题,假设数组长度是 9,第八次排完以后,后面八个数字已经按照顺序排列好了,剩下的那个最小的一定是在最前面,那么第九次就已经没有意义了,因为最小的已经在最前面了,不会再有任何换位置出现了,那么我们第九次遍历就不需要了,所以我们可以减少一次

2、第二个问题,第一次的时候,已经把最大的数字放在最后面了,那么第二次的时候,其实倒数第二个和最后一个就不用比了,因为我们就是要把倒数第二大的放在倒数第二的位置,即使比较了,也不会换位置,第三次就要倒数第三个数字就不用再和后两个比较了,以此类推,那么其实每次遍历的时候,就遍历当前次数 - 1 次

最终代码

 var arr = [3, 1, 5, 6, 4, 9, 7, 2, 8]//先准备一个乱序的数组
        for (var j = 0; j < arr.length - 1; j++) {
        //按照数组长度来进行多次遍历
            for (var i = 0; i < arr.length - 1 - j; i++) {
                // 判断,如果数组中的当前一个比后一个大,那么两个交换一下位置
                if (arr[i] > arr[i + 1]) {
                var tmp = arr[i]
                arr[i] = arr[i + 1]
                arr[i + 1] = tmp
                //借助第三个变量tmp,对满足条件的两项调换彼此位置
                }
            }
        }
        document.write(arr)//对排序完之后的数组在页面上输出

选择排序

思路

1、先假定数组中的第 0 个就是最小的数字的索引

2、然后遍历数组,只要有一个数字比我小,那么就替换之前记录的索引

3、知道数组遍历结束后,就能找到最小的那个索引,然后让最小的索引换到第 0 个的位置

4、再来第二趟遍历,假定第 1 个是最小的数字的索引

5、在遍历一次数组,找到比我小的那个数字的索引

6、遍历结束后换个位置

7、依次类推,也可以把数组排序好

最终代码

var arr = [3, 1, 5, 6, 4, 9, 7, 2, 8]
        for (var j = 0; j < arr.length - 1; j++) {
            var minIndex = j
    
            for (var i = j + 1; i < arr.length; i++) {
                if (arr[i] < arr[minIndex]) {
                minIndex = i
                }
            }
            if (minIndex !== j) {
                var tmp = arr[minIndex]
                arr[minIndex] = arr[j]
                arr[j] = tmp   
            }
        }
        document.write(arr)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值