首页 > 其他分享 >说说你对选择排序的理解?如何实现?应用场景?

说说你对选择排序的理解?如何实现?应用场景?

时间:2024-04-23 14:57:32浏览次数:22  
标签:minIndex arr 场景 下标 56 理解 80 排序

一、是什么

选择排序(Selection sort)是一种简单直观的排序算法,无论什么数据进去都是 O(n²)的时间复杂度,所以用到它的时候,数据规模越小越好

其基本思想是:首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置

然后再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排序序列的末尾

以此类推,直到所有元素均排序完毕

举个例子,一个数组为 56、12、80、91、29,其排序过程如下:

  • 第一次遍历时,从下标为 1 的位置即 56 开始,找出关键字值最小的记录 12,同下标为 0 的关键字 56 交换位置。此时数组为 12、56、80、91、20

  • 第二次遍历时,从下标为 2 的位置即 56 开始,找出最小值 20,同下标为 2 的关键字 56 互换位置,此时数组为12、20、80、91、56

  • 第三次遍历时,从下标为 3 的位置即 80 开始,找出最小值 56,同下标为 3 的关键字 80 互换位置,此时数组为 12、20、56、91、80

  • 第四次遍历时,从下标为 4 的位置即 91 开始,找出最小是 80,同下标为 4 的关键字 91 互换位置,此时排序完成,变成有序数组

二、如何实现

从上面可以看到,对于具有 n 个记录的无序表遍历 n-1 次,第i 次从无序表中第 i 个记录开始,找出后序关键字中最小的记录,然后放置在第 i 的位置上

直至到从第n个和第n-1个元素中选出最小的放在第n-1个位置

如下动画所示:

用代码表示则如下:

function selectionSort(arr) {
    var len = arr.length;
    var minIndex, temp;
    for (var i = 0; i < len - 1; i++) {
        minIndex = i;
        for (var j = i + 1; j < len; j++) {
            if (arr[j] < arr[minIndex]) {     // 寻找最小的数
                minIndex = j;                 // 将最小数的索引保存
            }
        }
        temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
    }
    return arr;
}

第一次内循环比较N - 1次,然后是N-2次,N-3次,……,最后一次内循环比较1次 共比较的次数是 (N - 1) + (N - 2) + ... + 1,求等差数列和,得 (N - 1 + 1)* N / 2 = N^2 / 2,舍去最高项系数,其时间复杂度为 O(N^2)

从上述也可以看到,选择排序是一种稳定的排序

三、应用场景

和冒泡排序一致,相比其它排序算法,这也是一个相对较高的时间复杂度,一般情况不推荐使用

但是我们还是要掌握冒泡排序的思想及实现,这对于我们的算法思维是有很大帮助的

参考文献

  • https://baike.baidu.com/item/%E9%80%89%E6%8B%A9%E6%8E%92%E5%BA%8F/9762418
  • https://zhuanlan.zhihu.com/p/29889599
  • http://data.biancheng.net/view/72.html

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

 

标签:minIndex,arr,场景,下标,56,理解,80,排序
From: https://www.cnblogs.com/smileZAZ/p/18152878

相关文章

  • 【rust】《Rust深度学习[4]-理解线性网络(Candle)》
    全连接/线性在神经网络中,全连接层,也称为线性层,是一种层,其中来自一层的所有输入都连接到下一层的每个激活单元。在大多数流行的机器学习模型中,网络的最后几层是完全连接的。实际上,这种类型的层执行基于在先前层中学习的特征输出类别预测的任务。全连接层的示例,具有四个输入节点......
  • 【rust】《Rust深度学习[5]-理解卷积神经网络(Candle)》
    卷积神经网络ConvolutionalNeuralNetwork,简称为CNN。CNN与一般的顺传播型神经网络不同,它不仅是由全结合层,还由卷积层(ConvolutionLayer)和池层(PoolingLayer)构成的神经网络。在卷积层和池化层中,如下图所示,缩小输入神经元的一部分区域,局部地与下一层进行对应。每一层都有一个称......
  • three.js使用Instanced Draw+Frustum Cull+LOD来渲染大场景(开源)
    大家好,本文使用three.js实现了渲染大场景,在移动端也有较好的性能,并给出了代码,分析了关键点,感谢大家~关键词:three.js、InstancedDraw、大场景、LOD、FrustumCull、优化、Web3D、WebGL、开源代码:Github我正在承接Web3D数字孪生项目,具体介绍可看承接各种Web3D业务加QQ群交流:106......
  • 理解 MySQL 字符集级别
    以下是以前的一些笔记,汇总一下。MySQL--迁移到uft8mb4需要考虑的事项MySQL8.0中utf8mb4的强大:释放多语言数据的全部潜能MySQL如何使用字符集配置选项  在讨论字符集时,通常会伴随以下一些问题:·修改MySQLServer的字符集是否会影响已有库和表·修改库的字符集是否会影......
  • Bresenham直线算法个人理解
    ​最近在学习野火的单片机的电容屏,顺便学习了一下屏幕的显示原理等内容,到了往屏幕中显示图像的时候遇到了一个算法,下面是我自己学习的一些笔记,该文章只是个人理解以及算法的简单实现,同时我在实现这个算法的时候并没有很好的考虑到算法的复杂度等条件,因此可能我自己算法的代码会相......
  • vis.js滚动和排序
    代码案例<!doctypehtml><html><head><title>Timeline</title><scripttype="text/javascript"src="https://unpkg.com/vis-timeline@latest/standalone/umd/vis-timeline-graph2d.min.js"></script>......
  • 初中中考阅读理解难题一网打尽!句子结构深度解析+答案揭秘,助你轻松冲刺中考高分!-009
    PDF格式公众号回复关键字:ZKYDT009原文1Howdidthelotlookatthebeginningofthestory?解析1How怎么样did,thelot场地,look看起来,atthebeginningofthestory?在故事的开头故事开始时,那个场地看起来怎么样?2Thisplacelookslikeadump.这个地方看......
  • 排序3-插入排序
    排序3-插入排序插入排序把排序对象分成已排序和未排序两个部分,每次选取未排序部分的首元素,将它插入已排序部分的合适部分插入排序(正序)//插入排序voidinsertSort(intarr[],intlength){intj;for(inti=1;i<length;i++){//i是无序部分首元素的下标......
  • grep 的使用场景
    场景1:grep中如何同时搜索A或者B?在使用grep命令进行文本搜索时,如果你想要搜索包含"A"或者"B"的行,可以使用以下两种方法:使用-e选项来为每个搜索模式指定一个表达式:grep-eA-eBfilename这里-eA表示搜索包含"A"的行,-eB表示搜索包含"B"的行。使用单个搜索模式并利用正......
  • 常见的排序算法——归并排序
    本文记述了自顶向下归并排序的基本思想和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。◆思想使用自顶向下的分治思想进行排序。将待排序元素分为两个待排序子范围,用递归的方式对两个子范围分别排序。然后将排序结果归并起来,即得到整体排序的结果。归并两个已......