请原谅我没有按照之前图片的分类来介绍排序算法,先说最简单的两种排序算法(冒泡略过),选择排序和插入排序,之前老是容易记混。默认输出升序的序列啊,哈哈。

选择排序

对于输入长度为n的数组,一共比较n-1趟,对第 i 趟比较,从第 i 个位置开始,第n个位置结束。找出其中最小元素并记录其位置x, 然后将第 i 个元素和第 x 个元素交换位置。

说白了,第一趟遍历找第一小的元素,第二趟遍历找第二小的元素。。。 多捞啊!

给出伪代码:

selectSort(A)
n ← A.length; for i from to n- do
j ← i; for k from j to n- do
if A[k]<A[j] then
j ← k;
end if
end for swap A[i] with A[j];
end for

时间复杂度  = 1+2+...+(n-1)

→ 时间复杂度为 O(n2),非常稳定,没有最好最坏情况,尴尬。由于没有使用额外空间,空间复杂度为O(1)。

每次插入的元素都和之间的所有元素进行了比较,所以为稳定排序。

插入排序

可以分为三步:

  1. 从第2个元素开始,如第 i 个元素,遍历之前索引从 0 到 i-1 的已排序序列,找到自己插入的位置。
  2. 将插入位置到第i-1位置的元素 后移一位
  3. 将第 i 个元素插入。

也即将新元素插入已经排序好的序列中,这个很像机器学习里的在线学习算法,具有学习能力。

给出伪代码:

insertSort(A)
n ← A.length; for i from to n- do # n- times insert
insertIndex ← i; for k from i- downto do # find insertIndex
if A[k]<A[i] then
insertIndex ← k+;
Break;
end if
end for
flag ← A[i]; for k from i- downto insertIndex do # move back elements
swap A[k] with A[k+]
end for A[insertIndex] ← flag; # finish insert
end for

在第一步中,寻找插入位置,本来顺着找也可以的。但是请思考,如果顺着找,遍历操作和后移操作加在一起,怎么着都需要O(n2)总的时间复杂度。而如果倒着找,就会有最好情况,如输入序列本身有序,那么时间复杂度即为O(n)。

由于没有用到额外空间,故此处空间复杂度为O(1)。

同样,插入元素同插入位置和原位置之间的元素都进行了比较,为稳定排序。

排序1 - 选择排序 & 插入排序的更多相关文章

  1. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  2. 数据结构和算法(Golang实现)(20)排序算法-选择排序

    选择排序 选择排序,一般我们指的是简单选择排序,也可以叫直接选择排序,它不像冒泡排序一样相邻地交换元素,而是通过选择最小的元素,每轮迭代只需交换一次.虽然交换次数比冒泡少很多,但效率和冒泡排序一样的糟 ...

  3. 选择排序—简单选择排序(Simple Selection Sort)

    基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素 ...

  4. 排序算法--选择排序(Selection Sort)_C#程序实现

    排序算法--选择排序(Selection Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来 ...

  5. 排序(Sort)-----选择排序

       声明:文中动画转载自https://blog.csdn.net/qq_34374664/article/details/79545940    1.选择排序简介 选择排序(Select Sort ...

  6. 选择排序—简单选择排序(Simple Selection Sort)原理以及Java实现

    基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素 ...

  7. 使用 js 实现十大排序算法: 选择排序

    使用 js 实现十大排序算法: 选择排序 选择排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  8. 【java排序】 选择排序,插入排序,希尔算法

    一.选择排序 1.基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换:然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止. 2.实例 3.算法 ...

  9. ArraySort--冒泡排序、选择排序、插入排序工具类demo

    public class ArraySort { private long[] a; private int nElems; public ArraySort(int max){ a=new long ...

随机推荐

  1. SpringBoot 性能调优

    1, 默认情况下,我们会使用 @SpringBootApplication 注解来自动获取应用的配置信息,但这样也会给应用带来一些副作用.使用这个注解后,会触发自动配置( auto-configura ...

  2. AttributeError: module 'tensorflow.python.keras.backend' has no attribute 'get_graph'处理办法

    原因:安装的tensorflow版本和keras版本不匹配,只需卸载keras,重新安装自己tensorflow对应的版本. Keras与tensorflow版本匹配查询网站  

  3. Servlet---request内置对象

    Request 对象: 问题: 浏览器发起请求到服务器,会遵循HTTP协议将请求数据发送给服务器. 那么服务器接受到请求的数据改怎么存储呢?不但要存,而且要保证完成性. 解决: 使用对象进行存储,服务 ...

  4. Activiti网关--并行网关

    1.什么是并行网关 并行网关允许将流程分成多条分支,也可以把多条分支汇聚到一起,并行网关的功能是基于进 入和外出顺序流的: fork 分支: 并行后的所有外出顺序流,为每个顺序流都创建一个并发分支. ...

  5. I、恋爱之子

    链接:https://ac.nowcoder.com/acm/contest/3570/I 来源:牛客网 题目描述 最近ZSC和他的女朋友NULL吵架了.因为ZSC是一个直男,他不知道该怎么办,于是他 ...

  6. 新安装的eclipse配置好了环境变量后,打开还是出现A Java runtime environment错误

    新安装的eclipse配置好了环境变量后,打开还是出现如下图的A Java runtime environment错误; 解决方法: 第一步: Windows环境下:把C:\Users\你的用户名 目 ...

  7. jmeter执行多条sql语句

    1.JDBC Connection Configuration 在配置DataBase URL的时候,加上allowMultiQueries=true 2.在JDBC Request中设置Quer T ...

  8. MyBatis(五):分页

    本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出一遍就懂!b站搜索狂神说或点击下面链接 https://space.bilibili.com/95256449?spm_id_from=33 ...

  9. Hadoop安装教程_单机(含Java、ssh安装配置)

    文章更新于:2020-3-24 按照惯例,需要的文件附上链接放在文首 文件名:Java SE Development Kit 8u241 文件大小:72 MB+ 下载链接:https://www.or ...

  10. PyJWT 详解

    1.首先,我们需要先了解 JWT 的概念,所以我们先看pyjwt的官网 https://jwt.io/ 2.对于官方 JWT 有两篇博文写的不错分别如下: https://blog.csdn.net/ ...