排序算法系列之——选择排序

上一次说完了冒泡排序,那么继续往下走,本次我们来理解选择排序算法

废话少说,进入正题

如有误,辛苦指正

背景介绍

(Selection sort)是一种简单直观的排序算法。它的工作原理是:

第一次从待排序的数据元素中的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中,然后放到已排序的序列的末尾。以此类推,。选择排序是不稳定的排序方法。

——选择排序算法

核心特点

  1. 循环遍历队列,先找出发第一次遍历整个数组后最小/最大的值
  2. 如果有更小/大的值。
  3. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

举个例子

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

至此我们就完成了选择排序的思路实现。

同上篇,排序方式带来的性能问题,及优化方案我们会在系列完结之后在视情况重新梳理,本次旨在便于大家理解。

你可能感兴趣的:(排序算法系列之——选择排序)