上一次说完了冒泡排序,那么继续往下走,本次我们来理解选择排序算法
废话少说,进入正题
如有误,辛苦指正
背景介绍
(Selection sort)是一种简单直观的排序算法。它的工作原理是:
第一次从待排序的数据元素中的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中,然后放到已排序的序列的末尾。以此类推,。选择排序是不稳定的排序方法。
——选择排序算法
核心特点
- 循环遍历队列,先找出发第一次遍历整个数组后最小/最大的值
- 如果有更小/大的值。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
举个例子
[ 1, 5, 4, 3, 6, 2, 7 ]
1、先将 1 和 后面的所有数字进行比较,得到1是最小的,将最小的放到数组第一个的位置,此时的数组呈现为(暂无变化)
[ 1, 5, 4, 3, 6, 2, 7 ]
2、紧接着开始用5来和后面的所有进行比较,因为1已经是最小了 所以每次只需要从当前数的后面开始比较即可,一个一个比较结束后发现2是最小的,那么将2和数组的第二个元素交换,此时数组前两位已经是 按照升序排序后的最终位置。
[ 1, 2, 4, 3, 6, 5, 7 ]
3、继续重复步骤二,直到最后两个元素比较完毕之后,最终的得到排序后的数组
[ 1, 2, 3, 4, 5, 6, 7 ]
...
此时,我们已经通过每次循环“选择”一个最小的数从数组的开头依次排放,直到最后两个元素比较完毕。
以上就是选择排序的大概算法流程,老规矩,不上代码的都是流氓
代码示例
1、我们创建一个排序方法,并接受一个参数,就是我们需要排序的数组
function selectionSort( _array ){
}
2、创建完毕后我们先来做第一步,声明两个变量,用来存放当前最小值的下标以及交换位置时使用的临时变量
function selectionSort( _array ){
//minIndex用来存放当前最小值在数组中的下标
var minIndex = 0;
//用来作为交换位置的临时变量
var _cache;
}
3、接着我们就要开始准备循环了,用第一个元素依次和后面的元素相比较,得到最小的一个值
function selectionSort( _array ){
//minIndex用来存放当前最小值在数组中的下标
var minIndex = 0;
//用来作为交换位置的临时变量
var _cache;
//因为minIndex的下标已经是0了,所以从1开始比较即可
for( let j = 1; j < _array.length; j++ ){
//如果后面比较的数比当前更小,那么将minIndex的值指向这个新的数的下标
if( _array[minIndex] > _array[j] ) {
minIndex = j;
}
}
//此时循环完毕后当前的minIndex的值就是最小数的下标
//_array[minIndex]的值就是最小的数
//然后我们将这个值和我们初始下标0的元素 交换一下值
_cache = _array[0];
_array[0] = _array[minIndex];
_array[minIndex] = _cache;
}
4、至此我们完成了第一轮循环,实现了找到第一个最小的数,并将它存放到数组开头的位置,剩下的操作就是不断地重复执行此步骤,直到数组排序完毕。
既然重复此步骤,那么新增的循环必然是在当前代码块的最外层
function selectionSort( _array ){
//minIndex用来存放当前最小值在数组中的下标
var minIndex;
//用来作为交换位置的临时变量
var _cache;
//我们开始循环,正好从零开始,我们就把minIndex每次的初始值设置为i的值
//同时我们只要循环到最后一个元素前面一个元素即可,因为内部循环会把当前的和最后的作比较
for( let i = 0; i < _array.length - 1; i++ ){
minIndex = i;
//这里因为每次是从当前值的后面开始,所以J的开始要改为i+1
for( let j = i + 1; j < _array.length; j++ ){
//如果后面比较的数比当前更小,那么将minIndex的值指向这个新的数的下标
if( _array[minIndex] > _array[j] ) {
minIndex = j;
}
}
//当内部循环完毕后 此时已经得到了每一次循环下的最小值,这里进行交换
//此时循环完毕后当前的minIndex的值就是最小数的下标
//这里可以加个判断,如果相等,那说明当前数就是最小的数,所以没必要再去交换了
if( i !== minIndex ){
_cache = _array[i];
_array[i] = _array[minIndex];
_array[minIndex] = _cache;
}
}
//至此所有循环结束后 当前的_array就已经是排序过后的数组了
return _array;
}
至此我们就完成了选择排序的思路实现。
同上篇,排序方式带来的性能问题,及优化方案我们会在系列完结之后在视情况重新梳理,本次旨在便于大家理解。