10 排序算法——选择排序

1.选择排序思路

2.选择排序基本实现

3.选择排序算法优化

1.选择排序思路

  1. 从数组的第一个开始,将第一个元素和其他元素进行比较,在检查完所有元素后,最小的元素会放在数组的第一个位置。
  2. 然后算法从第二个位置继续。

2.选择排序基本实现

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

function choose (arr) {
  // 最小元素的坐标
  let minIndex
  const len = arr.length
  for (let i = 0; i < len; i++) {
    minIndex = i
    // 遍历查找,如果存在更小元素,则替换最小元素坐标
    for (let j = i+1; j < len; j++) {
      if (arr[j] < arr[minIndex]) {
        minIndex = j
      }
    }
    // 找到了最小坐标,替换到乱序数组头部
    let middle = arr[i]
    arr[i] = arr[minIndex]
    arr[minIndex] = middle
  }
  return arr
}

console.log(choose(arr))  // [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

在这里插入图片描述

  1. 最小值下标:minIndex=i,确定每次循环的最小值下标
  2. j=i+1,循环比较i坐标后的值,如果存在arr[j]<arr[minIndex],minIndex = j
  3. [arr[i],arr[minIndex]] = [arr[minIndex],arr[i]],调换i下标和minIndex下标的值。
  4. 每一个i都确定了一个最小值,如第一轮i=0时确定了一个最小0,i=1是确定了一个最小1,前面确定的后面不能影响。
    规律:
    i=0,确定一个最小值,由于是升序,所以最小值的位置肯定在0,所以arr[0]与arr[minIndex]调换
    i=1,确定一个最小值,由于是升序,所在最小值的文字肯定在1,所以arr[1]与arr[minIndex]调换

3.选择排序算法优化

const arr = [8,0,4,6,1,2,7,3,5,9];

function choose (arr) {
  // 左指针,从左到右开始遍历
  let left = 0;
  // 右指针,从右到左开始遍历
  let right = arr.length - 1;
  // 最大值
  let max;
  // 最小值
  let min;
  // 数组值不止一个
  while (left < right) {
    max = left;
    min = left;
    for(let i = left + 1;i < arr.length - left; i++){
      // 同时寻找最小值和最大值坐标
      if(arr[i] > arr[max]){
        max = i;
      }
      if(arr[i] < arr[min]){
        min = i;
      }
    }
    // 如果找到的最大值不是末尾元素,则将最大值交换到末尾
    if(max !== right){
      [arr[max],arr[right]] = [arr[right],arr[max]]
    }
    if(min === right){
      min = max;
    }
    // 如果找到的最小值不是头部元素,则将最大值交换到头部
    if(min !== left){
      [arr[min],arr[left]] = [arr[left],arr[min]]
    }
    left++;
    right--;
  }
  return arr
}

console.log(choose(arr))

第一轮:

  1. left =0=min=max
  2. i =left +1,arr[1-8]<arr[arr[max=0]]arr[i=9]>arr[max=0],max = i =9
  3. i =left +1,arr[i=1] < arr[min = 0],min =i=1 /// min=1 != left=0,调换arr[0]与arr[1]

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值