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

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

废话少说,进入正题

如有误,辛苦指正

背景介绍

\color{#ea4335}{选择排序}(Selection sort)是一种简单直观的排序算法。它的工作原理是:

第一次从待排序的数据元素中\color{#4285f4}{选出最小(或最大)}的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中\color{#4285f4}{寻找最小(或最大)},然后放到已排序的序列的末尾。以此类推,\color{#34a853}{直到全部待排序的数据元素的个数为零}。选择排序是不稳定的排序方法。

——选择排序算法

核心特点

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

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

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

\color{#34a853}{感谢阅读!}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352