排序1 - 选择排序 & 插入排序
请原谅我没有按照之前图片的分类来介绍排序算法,先说最简单的两种排序算法(冒泡略过),选择排序和插入排序,之前老是容易记混。默认输出升序的序列啊,哈哈。
选择排序
对于输入长度为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)。
每次插入的元素都和之间的所有元素进行了比较,所以为稳定排序。
插入排序
可以分为三步:
- 从第2个元素开始,如第 i 个元素,遍历之前索引从 0 到 i-1 的已排序序列,找到自己插入的位置。
- 将插入位置到第i-1位置的元素 后移一位
- 将第 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 - 选择排序 & 插入排序的更多相关文章
- 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)
本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...
- 数据结构和算法(Golang实现)(20)排序算法-选择排序
选择排序 选择排序,一般我们指的是简单选择排序,也可以叫直接选择排序,它不像冒泡排序一样相邻地交换元素,而是通过选择最小的元素,每轮迭代只需交换一次.虽然交换次数比冒泡少很多,但效率和冒泡排序一样的糟 ...
- 选择排序—简单选择排序(Simple Selection Sort)
基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素 ...
- 排序算法--选择排序(Selection Sort)_C#程序实现
排序算法--选择排序(Selection Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来 ...
- 排序(Sort)-----选择排序
声明:文中动画转载自https://blog.csdn.net/qq_34374664/article/details/79545940 1.选择排序简介 选择排序(Select Sort ...
- 选择排序—简单选择排序(Simple Selection Sort)原理以及Java实现
基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素 ...
- 使用 js 实现十大排序算法: 选择排序
使用 js 实现十大排序算法: 选择排序 选择排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!
- 【java排序】 选择排序,插入排序,希尔算法
一.选择排序 1.基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换:然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止. 2.实例 3.算法 ...
- ArraySort--冒泡排序、选择排序、插入排序工具类demo
public class ArraySort { private long[] a; private int nElems; public ArraySort(int max){ a=new long ...
随机推荐
- SpringBoot 性能调优
1, 默认情况下,我们会使用 @SpringBootApplication 注解来自动获取应用的配置信息,但这样也会给应用带来一些副作用.使用这个注解后,会触发自动配置( auto-configura ...
- AttributeError: module 'tensorflow.python.keras.backend' has no attribute 'get_graph'处理办法
原因:安装的tensorflow版本和keras版本不匹配,只需卸载keras,重新安装自己tensorflow对应的版本. Keras与tensorflow版本匹配查询网站
- Servlet---request内置对象
Request 对象: 问题: 浏览器发起请求到服务器,会遵循HTTP协议将请求数据发送给服务器. 那么服务器接受到请求的数据改怎么存储呢?不但要存,而且要保证完成性. 解决: 使用对象进行存储,服务 ...
- Activiti网关--并行网关
1.什么是并行网关 并行网关允许将流程分成多条分支,也可以把多条分支汇聚到一起,并行网关的功能是基于进 入和外出顺序流的: fork 分支: 并行后的所有外出顺序流,为每个顺序流都创建一个并发分支. ...
- I、恋爱之子
链接:https://ac.nowcoder.com/acm/contest/3570/I 来源:牛客网 题目描述 最近ZSC和他的女朋友NULL吵架了.因为ZSC是一个直男,他不知道该怎么办,于是他 ...
- 新安装的eclipse配置好了环境变量后,打开还是出现A Java runtime environment错误
新安装的eclipse配置好了环境变量后,打开还是出现如下图的A Java runtime environment错误; 解决方法: 第一步: Windows环境下:把C:\Users\你的用户名 目 ...
- jmeter执行多条sql语句
1.JDBC Connection Configuration 在配置DataBase URL的时候,加上allowMultiQueries=true 2.在JDBC Request中设置Quer T ...
- MyBatis(五):分页
本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出一遍就懂!b站搜索狂神说或点击下面链接 https://space.bilibili.com/95256449?spm_id_from=33 ...
- Hadoop安装教程_单机(含Java、ssh安装配置)
文章更新于:2020-3-24 按照惯例,需要的文件附上链接放在文首 文件名:Java SE Development Kit 8u241 文件大小:72 MB+ 下载链接:https://www.or ...
- PyJWT 详解
1.首先,我们需要先了解 JWT 的概念,所以我们先看pyjwt的官网 https://jwt.io/ 2.对于官方 JWT 有两篇博文写的不错分别如下: https://blog.csdn.net/ ...