排序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 ...
随机推荐
- Java GC(垃圾回收)机制知识总结
目录 Java GC系列 Java关键术语 Java HotSpot 虚拟机 JVM体系结构 Java堆内存 启动Java垃圾回收 Java垃圾回收过程 垃圾回收中实例的终结 对象什么时候符合垃圾回收 ...
- Tensorboard 详解(上篇)
花间提壶华小厨 1. Tensorboard简介 对大部分人而言,深度神经网络就像一个黑盒子,其内部的组织.结构.以及其训练过程很难理清楚,这给深度神经网络原理的理解和工程化带来了很大的挑战.为了解决 ...
- 5分钟配置好你的AI开发环境
作者 | Revolver 无论是第一次设置TensorFlow的新手数据科学爱好者,还是使用TB级数据的经验丰富的AI工程师,安装库.软件包或者框架总是一个困难又繁琐的过程.但是像Docker这样的 ...
- Vue2.0 -- 钩子函数/ 过度属性/常用指令/以及Vue-resoure发送请求
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- POJ - 3468 线段树单点查询,单点修改区间查询,区间修改模板(求和)
题意: 给定一个数字n,表示这段区间的总长度.然后输入n个数,然后输入q,然后输入a,b,表示查询a,b,区间和,或者输入c 再输入三个数字a,b,c,更改a,b区间为c 思路: 线段树首先就是递归建 ...
- [noip模拟]计蒜姬<BFS>
Description 兔纸们有一个计蒜姬,奇怪的是,这个计蒜姬只有一个寄存器X.兔纸们每次可以把寄存器中的数字取出,进行如下四种运算的一种后,将结果放回寄存器中.1.X=X+X2.X=X-X3.X= ...
- B 基因改造
时间限制 : - MS 空间限制 : - KB 问题描述 "人类智慧的冰峰,只有萌萌哒的我寂寞地守望."--TBTB正走在改造人类智慧基因的路上.TB发现人类智慧基因一点也不 ...
- 为什么scanf(" %c",&c)中%c前要空格?
空格确实不是必须的,但有了空格就可以忽略你输入的空格. ****例如:scanf(" %c" ,&c),你输入了' a'(a前面有个空格),a就能被c接受. 但控制符前如果 ...
- web页面调用支付宝支付
web页面调用支付宝支付 此文章是前端单独模拟完成支付,若在线上环境则需要后台配合产生签名等参数 在蚂蚁金服开放平台申请沙箱环境 将沙箱环境中的密钥.应用网关.回调地址补全,生成密钥的方法在此 配置好 ...
- Java static修饰符
Java static修饰符 static修饰符是静态修饰符,大家写Java第一次接触static就是主函数中的pubic static void main的声明了. 那么static有什么用?本文来 ...