前端算法之排序(二)---- 选择排序

写在前面
昨天我们学习了最基础的排序算法----冒泡排序,今天呢,我们一起来看一下冒泡排序的进阶算法,选择排序。

大家在学习冒泡排序的时候,会不会觉得冒泡排序很繁琐呢?你看,要两层循环,每次比较都要遍历一次数组,这还好说,但是要交换好多好多次才能正确排序,简直太麻烦了!历史上也有程序员前辈抱怨这个问题,因此,冒泡排序的进阶升级版----选择排序就诞生了。

选择排序:
选择排序的基本思想是:遍历数列,在数列中找到一个最小的元素放在首位,然后再次遍历数列,再剩余的元素中找到最小的放在第二位,以此类推直到正确排序。

这样的话,虽然好像还是需要两层循环,不停遍历数组,但是交换位置的次数好像少了很多!我们举个例子来具体看下:

设数组 arr = [1, 4, 3, 5, 2] ,我们需要将数组中的数字按照从大到小的顺序重新排序。

第一轮排序:

arr = [1, 4, 3, 5, 2]

arr[0] = 1 与 arr[1] = 4 进行比较,1 < 4,1是最小元素,不交换;

arr[0] = 1 与 arr[2] = 3 进行比较,1 < 3,1是最小元素,不交换;

arr[0] = 1 与 arr[3] = 5 进行比较,1< 5,1是最小元素,不交换;

arr[0] = 1 与 arr[4] = 2 进行比较,1 < 2,1是最小元素,不交换。

遍历结束,1为最小元素且在第一位,位置不变。

第一轮排序之后,我们发现最小的数字就在第一位,数组没有变化,还是arr = [1, 4, 3, 5, 2],接下来我们进行第二轮排序:

第二轮排序:

arr = [1, 4, 3, 5, 2]

arr[1] = 4 与 arr[2] = 3 进行比较,4 > 3,3是最小元素,交换;

arr[1] = 3 与 arr[3] = 5 进行比较(注意此时arr[1]已经变为3了哦 ),3 < 5,3是最小元素,不交换;

arr[1] = 3 与 arr[4] = 2 进行比较,3 > 2,2为最小元素,交换。

遍历结束,最小元素为2且交换到了第二位,数组arr = [1, 2, 4, 5, 3],接下来进行第三轮排序。

第三轮排序:

arr = [1, 2, 4, 5, 3]

arr[2] = 4 与 arr[3] = 5 进行比较,4 < 5,4是最小元素,不交换;

arr[2] = 4 与 arr[4] = 3 进行比较,4 > 3,3是最小元素,交换;

遍历结束,最小元素为3且交换到了第三位,数组arr = [1, 2, 3, 5, 4],接下来进行第四轮排序。

第四轮排序:

arr = [1, 2, 3, 5, 4]

arr[3] = 5 与 arr[4] = 4 进行比较,5 < 4,4为最小元素,交换。

遍历结束,最小元素为4且交换到了第四位,选择排序算法结束,数组arr = [1, 2, 3, 4, 5]

只通过这一个例子,大家就能明显看出,在交换次数上选择排序确实比冒泡排序少了很多。

我们来看一下选择排序的特点;

特点一:从待排序数列中获取最小的元素放在已排数据末尾

特点二:n个数进行n - 1 次排序

接下来看一下代码实现:

代码实现:

let arr = [1, 4, 3, 5, 2];
var selectSort = function(arr){
    let len = arr.length;
    for(let i = 0; i < len - 1; i++){
        let index = i;//设置一个指针,保存最小的元素
        //这里采用了双指针思想,让指针 j 在指针 i 的后面一位,保证遍历时不会再次遍历已经归位的最小元素
        for(let j = i + 1; j < len; j++){
            if(arr[index] > arr[j]){
              index = j;//让指针保存最小的元素
            }
        }
        let temp = arr[i];
        arr[i] = arr[index];
        arr[index] = temp;
    }
    return arr;
}

代码如上。这里使用了双指针思想,把 i 和 j 都假设为一个指针,i 指针指向数组第一个数字,j 指针指向 i 指针后面的元素,当 i + 1 时,j 也会随之+ 1,这样就避免了再次遍历数组时会遍历到我们已经排序完毕的元素,也就是我们放在数组头部的arr[0]。

接下来我们看一下选择排序的时间复杂度和空间复杂度

时间复杂度:

选择排序依然使用两层 for 循环,只是交换元素的次数下降了,所以时间复杂度依然是O(n²)

空间复杂度:

很明显,选择排序的空间复杂度为0(1)

总结

  • 特点
    (1)特点一:从待排序数列中获取最小的元素放在已排数据末尾

    (2)特点二:n个数进行n - 1 次排序

  • 时间复杂度与空间复杂度
    时间复杂度:O(n²)
    空间复杂度:O(1)

OK,选择排序就讲到这里,如果有补充,欢迎大家评论区留言,希望你学得开心,see you soon~

这个系列的其他文章:
前端算法之排序(一)---- 冒泡排序

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

推荐阅读更多精彩内容