JavaScript基础算法之选择排序

排序思想

  • 先假定数组中的第 0 个就是最小的数字的索引
  • 然后遍历数组,只要有一个数字比我小,那么就替换之前记录的索引
  • 知道数组遍历结束后,就能找到最小的那个索引,然后让最小的索引换到第 0 个的位置
  • 再来第二趟遍历,假定第 1 个是最小的数字的索引
  • 在遍历一次数组,找到比我小的那个数字的索引
  • 遍历结束后换个位置
  • 依次类推,也可以把数组排序好

1、准备一个数组

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

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

var minIndex = 0

3、遍历数组,判断,只要数字比我小,那么就替换掉原先记录的索引

var minIndex = 0
for (var i = 0; i < arr.length; i++) {
  if (arr[i] < arr[minIndex]) {
    minIndex = i
  }
}

// 遍历结束后找到最小的索引
// 让第 minIndex 个和第 0 个交换
var temp = arr[minIndex]
arr[minIndex] = arr[0]
arr[0] = temp

4、按照数组的长度重复执行上面的代码

for (var j = 0; j < arr.length; j++) {
  // 因为第一遍的时候假定第 0 个,第二遍的时候假定第 1 个
  // 所以我们要假定第 j 个就行
  var minIndex = j
  
  // 因为之前已经把最小的放在最前面了,后面的循环就不需要判断前面的了
  // 直接从 j + 1 开始
  for (var i = j + 1; i < arr.length; i++) {
    if (arr[i] < arr[minIndex]) {
      minIndex = i
    }
  }

  // 遍历结束后找到最小的索引
  // 第一趟的时候是和第 0 个交换,第二趟的时候是和第 1 个交换
  // 我们直接和第 j 个交换就行
  var temp = arr[minIndex]
  arr[minIndex] = arr[j]
  arr[j] = temp
}

5、和之前一样,倒数第二次排序完毕之后,就已经排好了,最后一次也没有必要了

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
    }
  }

  var temp = arr[minIndex]
  arr[minIndex] = arr[j]
  arr[j] = temp
}
  • 在交换变量之前,可以判断一下,如果我们遍历后得到的索引和当前的索引一样
  • 那么就证明当前这个就是目前最小的,那么就没有必要交换
  • 最后我们要判断,最小索引和当前索引不一样的时候,才交换
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 temp = arr[minIndex]
    arr[minIndex] = arr[j]
    arr[j] = temp   
  }
}

6、至此,选择排序完成。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值