数据结构与算法 / 排序算法(1)
零、前言
1、常用的排序算法总结
排序算法种类 | 时间复杂度 | 是否基于比较 |
冒泡、插入、选择 | O(n^2) | √ |
快排、归并 | O(nlogn) | √ |
桶、计数、基数 | O(n) | × |
2、算法的内存消耗 - 原地排序
指的是空间复杂度是 O(1) 排序算法。
4、算法的稳定性
原来序列中相等的元素,经过排序之后,相等元素之间原有的先后顺序不变。
一、冒泡排序
1、原地排序?
属于原地排序算法。冒泡排序仅仅数据交换用到了交换操作,只需常量级的临时空间,空间复杂度为O(1)。
2、稳定性排序?
属于稳定排序算法。为了实现稳定排序,只需要保证在比较时发现相等时不交换数据即可,故。
3、时间复杂度
(1)最好的情况
待排序的数据已有序,则只需进行一次冒泡排序即可,时间复杂度为 O(1) 。
(2)最坏的情况
待排序的数据是倒序,则需要 n 次冒泡排序,时间复杂度为 O(n^2) 。具体的计算公式看下面网址:https://blog.csdn.net/itworld123/article/details/90766948
(3)平均时间复杂度
对于最好的情况,需要交换 0 次,针对最坏的情况,需要交换 n(n-1)/2,因为数据排布具有随机性,故交换次数的平均值为 n(n-1)/4,时间复杂度依然为 O(n^2) 。
二、插入排序
1、原理
将待排序的数列分成两组,分别是已排序部分和未排序部分。排序的过程就是将未排序中的数据逐一与已排序的数据进行比较,将该数据插入到已排序的数列中。
2、原地排序?
属于原地排序算法。根据代码,插入排序过程中不需要额外的空间,空间复杂度为 O(1) 。
3、稳定性排序?
属于稳定排序算法。为了实现稳定性排序,可以将后面数据插入到前面与之相同的数据的后面即可。
4、时间复杂度
(1)最好的情况
待排序的数据已有序,每个元素进行一次比较即可,时间复杂度为 O(1) 。
(2)最坏的情况
待排序的数据是倒序,则:
第 2 个数据和第 1 个数据比较,比较 1 次;
第 3 个数据和第1、2个数据比较,比较 2 次;
第 4 个数据和第1、2、3个数据比较,比较 3 次;
…… ……
第 n 个数据和第1、2、3、……、(n-1) 个数据比较,比较 (n-1) 次;
比较次数和为 n(n-1)/2,时间复杂度为 O(n^2) 。
(3)平均时间复杂度
由于数据排布具有随机性,故平均时间复杂度为 O(n^2) 。
三、选择排序
1、原理
和插入排序类似,也是将数列分成了已排序部分和未排序部分,但是选择排序算法是从未排序部分选择最小值和当前数据进行交换。
2、原地排序?
属于原地排序算法。根据代码,选择排序过程中不需要额外的空间,空间复杂度为 O(1) 。
3、稳定性排序?
不属于稳定排序算法。因为存在大量的交换,容易导致在交换过程中相同的两个数据前后位置发生变化。
栗子:5、8、5、2、9
比较时,“5”和“2”会调换位置,那么两个“5”的原来的位置就颠倒了。
4、时间复杂度
(1)最好的情况
待排序的数据已有序,每个元素进行一次比较即可,时间复杂度为 O(1) 。
(2)最坏的情况
待排序的数据是倒序,则:
第 1 个数据和第 2、3、……、n 个数据比较,比较 (n-1) 次;
第 2 个数据和第 3、4、……、n 个数据比较,比较 (n-2) 次;
第 3 个数据和第 4、5、……、n 个数据比较,比较 (n-3) 次;
…… ……
第 (n-1) 个数据和第 n 个数据比较,比较 1 次;
比较次数和为 n(n-1)/2,时间复杂度为 O(n^2) 。
(3)平均时间复杂度
由于数据排布具有随机性,故平均时间复杂度为 O(n^2) 。
四、插入比冒泡更受欢迎的原因
因为冒泡排序中每次交换需要 3 条赋值语句,而插入排序则仅仅需要1次。
#define SWAP(x, y) \do \{ \(x) ^= (y); \(y) ^= (x); \(x) ^= (y); \} while (false)
五、总结
1、性质
算法种类 | 时间复杂度 | 空间复杂度 | 原地排序 | 稳定排序 |
冒泡排序 | O(n^2) | O(1) | √ | √ |
插入排序 | O(n^2) | O(1) | √ | √ |
选择排序 | O(n^2) | O(1) | √ | × |
2、源代码
Github
(SAW:Game Over!)
数据结构与算法 / 排序算法(1)相关推荐
- Java数据结构第一讲-排序算法
常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...
- [ 数据结构 -- 手撕排序算法第三篇 ] 希尔排序
手撕排序算法系列之:希尔排序. 从本篇文章开始,我会介绍并分析常见的几种排序,大致包括插入排序,冒泡排序,希尔排序,选择排序,堆排序,快速排序,归并排序等. 大家可以点击此链接阅读其他排序算法:排序算 ...
- 数据结构与算法 / 排序算法 / 堆排序
一.定义 借助堆结构实现的排序算法被称为堆排序. 二.过程说明 1.建堆 (1)方法1 原地建堆,对于数组来说,从前往后:对于树来说,从下向上. 将数组的第一个元素作为堆顶,第二个元素做向堆中插入数据 ...
- 数据结构与算法 / 排序算法(3)
一.桶排序(Bucket sort) 1.原理 将要排序的数据分到几个有序的桶里,每个桶里的数据再进行排序.桶内的数据排序完毕之后,再把桶里的数据依次取出,组成的序列就是有序的了. 2.原地排序? 属 ...
- 值得收藏的时间复杂度速查表:数据结构操作、排序算法、图操作、堆操作
时间复杂度速查表 这篇文章覆盖了计算机科学里面常见算法的时间和空间的大 OBig-O 复杂度. 在参加面试前,我们经常需要花费很多时间从互联网上查找各种搜索和排序算法的优劣,了节省大家的时间,我收集了 ...
- 数据结构-常用的排序算法
总第123篇 好久不见哈,我终于又更新了,惊不惊喜,意不意外,哈哈哈哈.等之后会专门写一篇文章给大家汇报汇报我最近在忙什么呢,今天这篇还是接着之前的数据结构系列继续,主要讲讲数据结构里面常用的几种排序 ...
- 数据结构的六大排序算法详解
文章目录 一.简单排序 1.Comparable接口介绍 2.冒泡排序 3.选择排序 4.插入排序 二.高级排序 1.希尔排序 2.归并排序 3.快速排序 4.排序的稳定性 一.简单排序 在我们的程序 ...
- 数据结构基础和排序算法
数据结构和算法 1. 数据结构 1.1 稀疏数组 这个简单 稀疏数组即二维数组中有大量为0或同一个无效值的时候,将其压缩为只有有效数据的稀疏数组,需要使用时将其读写出来转为二维数组. public c ...
- 数据结构进阶 八大排序算法详解
数据结构就是定义出某种结构:像数组结构.链表结构.树形结构等,实现数据结构就是我们主动去管理增删查改的实现函数 排序的概念 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列 ...
- 数据结构和常用排序算法复杂度
1.顺序表 插入操作时间复杂度 最好O(1),最坏O(n),平均O(n) 移动结点的平均次数n/2 删除操作时间复杂度 最好O(1),最坏O(n),平均O(n) 移动结点的平均次数(n-1)/2 按值 ...
最新文章
- python set list str转换
- 数据库 sqlite top写法
- MPLS转发过程中涉及的相关概念—Vecloud微云
- Spring注解标签详解@Autowired @Qualifier等
- SpringBoot+Shiro学习(八):RememberMe
- 一个filter引起的404错误
- 使用Docker搭建私有云笔记
- poj1511 InvitationCards 最短路 Dijkstra堆优化
- Android 功耗(7)---思维导图
- 动态规划之01背包问题(含代码C)
- VMRC 控制台的连接已断开
- 立创开源 | 基于stm32的稳定输出9v的双向DCDC自动稳压系统
- SQL Server导出MDF数据库文件
- 推荐几个移动端前端UI框架
- 解决vue中双击事件会触发两次单击事件问题
- 网络(韩志刚版笔记)
- Note_Master-Detail Application(iOS template)_05_ YJYMasterViewController.m
- 键盘鼠标是计算机标准输入输出设备,微型计算机输入输出设备之键盘和鼠标(ppt 32页).ppt...
- 题目:我立志成为一名好销售,万万没想到,我还是走了程序员的路,原因竟然是....
- 闪存,ROM,Nor Flash,NAND Flash
热门文章
- leetcode- Single Number
- 整理就知识,你会在里面发现新的东西
- 11.2.0.2 HAIP
- Java的代理模式之静态代理和动态代理
- SpringBatch顺序读取多文件(MultiResourceItemReader)和顺序写文件(MultiResourceItemWriter)(二)
- k8s控制器模式介绍
- 【收藏】sonar-scanner扫描代码出错 SonarQube svn: E170001
- vue键盘事件:@keyup.down下方向键绑定事件
- K8S滚动更新示例演示
- linux awk列数据处理工具使用示例