什么是选择排序?

原文链接:https://note.noxussj.top/?source=helloworld


什么是选择排序(selectSort)?

选择排序就是在一个排列中划分为有序区和无序区,有序区在左边,无序区在右边。首先在无序区中找到最小元素,存放到有序区的起始位置,然后再从剩余的无序区中继续寻找最小元素,然后放到有序区的末尾。以此类推,直到无序区没有元素可排列。

算法步骤

  1. 首先在数组中查找出最小的元素
  2. 把当前最小元素放在数组的第一位
  3. 继续查找数组中最小的元素(不包含刚才找过的最小元素)
  4. 把当前最小元素放在数组的第二位
  5. 以此类推,执行 n - 1 轮
  6. 完成排序

动画演示链接

https://visualgo.net/zh/sorting

image

基础案例

  • 时间复杂度:O (n ^ 2)
  • 空间复杂度:O (1)

javascript

1Array.prototype.selectSort = function () { 2 for (let i = 0; i < this.length - 1; i++) { 3 let indexMin = i 4 5 for (let j = i; j < this.length; j++) { 6 if (this[j] < this[indexMin]) { 7 indexMin = j 8 } 9 } 10 11 if (indexMin !== i) { 12 const temp = this[i] 13 this[i] = this[indexMin] 14 this[indexMin] = temp 15 } 16 } 17} 18 19const arr = [5, 4, 3, 2, 1] 20 21arr.selectSort() // [1, 2, 3, 4, 5]

因为存在两个嵌套循环,所以时间复杂度是 O (n ^ 2),而时间复杂度是 O (1),因为没有使用线性增长的数据结构。

点赞
收藏

评论区

加载中...

相关推荐

swap空间的增减方法

(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap

【排序算法动画解】直接插入排序

本文为系列专题的第14篇文章。1.2.3.4.5.6.7.8.9.10.11.12.13.前面介绍了已经介绍了三种排序,暴力排序、冒泡排序和简单选择排序,一个共同点都是基于交换。我们可以用另一种视角来看待排序,即将一个待排序的数组看成两个部分:有序区和乱序区。在排序开始前,整个数组都是乱序区,而有序区则为空:排序开始后,有序区

Python常用算法(一)

1.选择排序不断找到最小的(找最大的也是可以的)首先拿到第一个,然后发现比它小的,记住下标。循环一轮,找到最小的数的位置和最左边的数交换位置然后从第二个开始....和第二个交换位置,循环最后变得有序codingutf8defselect_sort(list):foriin

Twitter的分布式自增ID算法snowflake (Java版)

概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移

mysql设置时区

mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0

PHP快速排序(原地切分)

        快速排序是一种分治的排序算法,采用递归的思想,将数组元素分为两部分,选择切分元素,左右扫描数组,将大于切分元素的数据放在右边,小于切分元素的数据放在左边,直到扫描指针相遇,切分结束,同时递归调用,直到数组有序。      代码如下:<?phpfunctionquick_sort(array&$array,$l