选择排序

选择排序

  1. 选择排序原理
    1. 外层循环控制循环的次数,每次循环找出一个最大值,当集合中只剩下一个元素没有被选中位最大值的时候,说明它是最小值,可以减少一次循环,所以循环的次数是集合的长度-1
    2. 内层循环找集合中的最大元素
      1. 第一次循环,找出集合中最大的元素,放在元素的最后一位
      2. 第二次循环,最后一位已经是集合中的最大的元素了,所以不用再对其进行比较,找出前边元素中的最大的元素,放入到倒数第二位中
      3. 第三次循环,与第二次类似,找出前边的最大的元素,放入到倒数第三位中
      4. 依此类推,对其他元素做同样的操作
  2. 选择排序源码
// 创建一个要排序的数组
const arr = [5, 2, 4, 7, 1, 9, 0, 3]

// 比较两个元素的大小
const compare = (a, b) => {
  if (a < b) return true
  else return false
}

// 交换两个元素的位置
const exchange = (arr, a, b) => {
  let temp = arr[a]
  arr[a] = arr[b]
  arr[b] = temp
}

const sort = arr => {
  
  for (let i = 0; i < arr.length -1; i++) {
    // 用来保存最大值的索引
    let maxIndex = 0
    // 如果arr[maxIndex] < arr[j], 将j的值赋给maxIndex,继续向后比较,直到当前循环结束
    // 已经排出来的元素不参与下一轮循环,所以这里要-i, 提升性能
    for (let j = 1; j < arr.length - i; j++) {
      if (compare(arr[maxIndex], arr[j])) {
        maxIndex = j
      }
    }
    // 找出最大元素的索引值,如果是第一次遍历, 则与最后一位元素交换位置;如果是第二次遍历,则与倒数第二位元素交换位置,依此类推
    exchange(arr, maxIndex, arr.length - i -1)
  }

  return arr
}

console.log(sort(arr))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值