每天一个排序算法 ---选择排序

296 阅读1分钟

选择排序算法是一种原址比较排序算法。选择排序大致的思路是找到数据结构中的最小值并将其放置在第一位,接着找到第二小的值并将其放在第二位,以此类推。

与冒泡排序一样都需要两个for循环遍历,不同点是交换的思路不同

  1. 冒泡排序是在循环遍历中,比较相邻两数大小并交换位置
  2. 选择排序是在循环遍历中记录本轮循环最小值的索引,当本轮循环完后交换遍历开始索引与最小值索引的值

思路:
有n个数,需要n轮遍历
每次遍历,较上轮需要比较的次数 - 1

const array = [5, 4, 3, 2, 1]
let minIndex 
for(i = 0;i < array.length; i++){
  minIndex = i	// 每轮开始默认最小值索引
	for(j = i; j < array.length; j++){
  	if(array[minIndex] > array[j]){
    	minIndex = j
    }
  }
  // 如果遍历完一轮,minIndex改变了,就交换值,i是本轮默认最小值的索引
  if(minIndex !== i){
    [array[minIndex],array[i]] = [array[i],arr[minIndex]]  // 解构赋值
  }
}
console.log(array)

与冒泡排序两次for循环比较,j的初始值参数是等于i的,为什么不能从0开始

  1. 冒泡排是每轮是将大数的放在最后,每轮比较不会用到已经排好的值,所以可以从0开始
  2. 选择排序是每轮将最小的放在前面,每轮比较需要到最后,所以必须从i开始


选择排序同样也是一个复杂度为 O(n2n^2)的算法,和冒泡排序一样。