扑克牌排序_简单的算法(2)--选择排序

6eb25c1e7825d83e8b75ea07eb416549.png

选择排序,可以说是最简单直观的排序方法了。

一般来说选择排序是将最小数字与第一(n)位进行交换,并重复这一过程;但是对于刚学习编程的人来说,如何写出交换的过程,稍微有一些复杂。

下面先介绍一下更符合人类思考方式的方法,简单的过程如下:

1.先把一组数字浏览一遍,我们找出其中最小的数字

2. 在旧数组里拿出来

3. 再放到一个新地方(数组)

这样重复操作到每个数字,将所有数字都放到新数组,就从小到大排序完成了。

这里还是用13个数字假装成扑克牌进行演示

[3, 6, 12, 7, 5, 1, 13, 8, 10, 2, 4, 9, 11]

9fd33a8f2ccf56553eea27d7b2a7fd25.png

其实不用多说一眼就可以看明白,只要重复排序过程(要排序的数字次),就排序完成啦。

下面写一下关键代码:

// 1.找出其中最小的数字min, 顺便找到它的位置minIndex
let min = arr[0]
let minIndex
for (let i=1; i<arr.length; i++) {
  if (arr[i] < min) {
    min = arr[i]
    minIndex = i
  }
}

// 2.在旧数组里拿出来
arr.splice(minIndex, 1)
// 在JavaScript中很简单只要用splice就可以了, 其他语言可能这一步要麻烦一点

// 3. 再将这个数字放到一个新数组
let sorted = []
sorted.push(min)

把这些步骤组合起来,重复执行13次(每个数字执行一次)即可完成排序:

let arr = [3, 6, 12, 7, 5, 1, 13, 8, 10, 2, 4, 9, 11] 
let sorted = []                         // 定义一个新地方放排序过的数字
let length = arr.length                 // 次数:每个数字都要排一次
for (let j=0; j<length; j++) {
  let min = arr[0]                      // 这里是步骤1
  let minIndex
  for (let i=1; i<length; i++) {
    if (arr[i] < min) {
      min = arr[i]
      minIndex = i
    }
  }
  arr.splice(minIndex, 1)               // 步骤2
  sorted.push(min)                      // 步骤3

  console.log(arr)                      // 这里输出每一步可以清楚看到过程
  console.log(sorted)
}

顺便把比较常见的选择排序写下来:

let arr = [3, 6, 12, 7, 5, 1, 13, 8, 10, 2, 4, 9, 11]
let length = arr.length
for (let j=0; j<length; j++) {                        // 外侧循环j确定要交换的数字位置
  let min = arr[j]
  let minIndex = j                                    // minIndex需要设定默认最小值位置
  for (let i=j; i<length; i++) {                      // 内层循环找出j之后最小数字的位置
    if (arr[i] < min) {
      min = arr[i]
      minIndex = i
    }
  }
  [arr[j], arr[minIndex]] = [arr[minIndex], arr[j]]   // 这里进行数字交换,也可以使用其他方法
  console.log(arr)
}

当然选择排序也有很多优化的方法,比如再循环中‘我拿大,你拿小’就可以减少一半过程,但是由于这个排序很少用到,只要领会思想就够了,以后有机会再写。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值