稳定性

定义:值相同的元素在排序完成之后能否保证原有的次序不变(同样值的个体之间,如果不因为排序而改变相对次序,这个排序就是有稳定性的,否则就没有)

举例:

[2,1,3,1]-->[1,1,2,3]
① ② ① ②

在排完序后,第一个1和第二个1的次序还是一样的

在基础数组中,排序的稳定性用处不大(因为都是数,没必要区分次序)

但是,在一些非基础数据的排序中就很有用

例如,现在有一堆学生的数据,含班级年龄两个属性

现要对其进行排序,可以通过比较器实现

按年龄从小到大排,排好后就得到一个年龄从小到大的数组

之后我再按照班级从小到大排序

那么如果算法是稳定的,结果会得到一个按班级顺序排好的序,并且每个班级中的学生,年龄是从小到大的排序

再举个例子,

购物网站排序,我们先选价格从低到高排序,再选择好评度从高到低排序,就会得到“物美价廉”的一个商品排序

这是排序算法稳定性的重要应用

不具备稳定性的排序:

选择排序(因为会涉及到相同数值位置的交换)

快速排序

堆排序

具备稳定性的排序:

冒泡排序(因为相邻两数相等时不交换)

插入排序(也可以做到,只要相邻两数相等时不交换)

归并排序(merge的时候遇到相等值先拷贝左边的,所有的拷完再拷右边的就可以)

一切桶排序思想下的排序

总结

能用快排就用快排;(快)

有空间限制就用堆排;(省内存)

对稳定性有需求用归并;(稳定性)

目前没有找到时间复杂度О(N*logN),额外空间复杂度0(1),又稳定的排序。

常见的坑

1,归并排序的额外空间复杂度可以变成0(1),但是非常难,不需要掌握,有兴趣可以搜“归并排序内部缓存法”

2,“原地归并排序”的帖子都是垃圾,会让归并排序的时间复杂度变成O(N^2)3,快速排序可以做到稳定性问题,但是非常难,不需要掌握,可以搜“O1 stable sort

4,所有的改进都不重要,因为目前没有找到时间复杂度O(N*logN),额外空间复杂度0(1),又稳定的排序。

5,有一道题目,是奇数放在数组左边,偶数放在数组右边,还要求原始的相对次序不变,碰到这个问题,可以怼面试官。可以用论文O1 stable sort的方法实现,但是很难,快排partition可以做到区分奇偶但是无法保证次序

工程上对排序的改进

1)充分利用О(N*logN)和O(N^2)排序各自的优势

例如,在一个大样本数据中先使用快排。等划分到比较小的范围之后(小于60)就转而使用插入排序。

等于是:快排用于调度,插入排序用于具体排序

2)稳定性的考虑

系统实现的排序方法在发现你的数据时基础类型是就会使用快排,发现是自定义类型(非基础类型)就会给你用归并,请问为什么?

答:

因为这是考虑了算法的稳定性。

基础类型无需稳定性,使用快排效率最高;

而自定义类型要满足可能需要的稳定性,所以用归并

【算法day5】排序算法的稳定性及其汇总的更多相关文章

  1. javascript数据结构与算法--高级排序算法

    javascript数据结构与算法--高级排序算法 高级排序算法是处理大型数据集的最高效排序算法,它是处理的数据集可以达到上百万个元素,而不仅仅是几百个或者几千个.现在我们来学习下2种高级排序算法-- ...

  2. 在Object-C中学习数据结构与算法之排序算法

    笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...

  3. c/c++ 通用的(泛型)算法 之 只读算法,写算法,排序算法

    通用的(泛型)算法 之 只读算法,写算法,排序算法 只读算法: 函数名 功能描述 accumulate 求容器里元素的和 equal 比较2个容器里的元素 写算法 函数名 功能描述 fill 用给定值 ...

  4. javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法)

    javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法) 一.快速排序算法 /* * 这个函数首先检查数组的长度是否为0.如果是,那么这个数组就不需要任何排序,函数直接返回. * ...

  5. javascript数据结构与算法--基本排序算法(冒泡、选择、排序)及效率比较

    javascript数据结构与算法--基本排序算法(冒泡.选择.排序)及效率比较 一.数组测试平台. javascript数据结构与算法--基本排序(封装基本数组的操作),封装常规数组操作的函数,比如 ...

  6. JS中算法之排序算法

    1.基本排序算法 1.1.冒泡排序 它是最慢的排序算法之一. 1.不断比较相邻的两个元素,如果前一个比后一个大,则交换位置. 2.当比较完第一轮的时候最后一个元素应该是最大的一个. 3.按照步骤一的方 ...

  7. 【每日算法】排序算法总结(复杂度&稳定性)

    一.插入排序:稳定,时间复杂度O(n^2) 想象你在打扑克牌,一開始左手是空的,接着右手開始从桌上摸牌,并将其插入到左手的一把牌中的正确位置上.为了找到这个正确位置,我们须要从右到左将它与手中的牌比較 ...

  8. 数据结构与算法之排序算法(python实现)

    1.冒泡排序 冒泡排序的原理是依次比较相邻的两个数,如果前一个数比后一个数大则交换位置,这样一组比较下来会得到该组最大的那个数,并且已经放置在最后,下一轮用同样的方法可以得到次大的数,并且被放置在正确 ...

  9. 数据结构与算法——常用排序算法及其Java实现

    冒泡排序 原理:依次比较相邻的两个数,将小数放在前面(左边),大数放在后面(右边),就像冒泡一样具体操作:第一趟,首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数放前 ...

  10. STL源代码分析——STL算法sort排序算法

    前言 因为在前文的<STL算法剖析>中,源代码剖析许多,不方便学习,也不方便以后复习.这里把这些算法进行归类,对他们单独的源代码剖析进行解说.本文介绍的STL算法中的sort排序算法,SG ...

随机推荐

  1. [转帖]五类IP的范围

    五类IP的范围 IP地址分为A,B,C,D,E五类. 网络号:用于识别主机所在的网络:  主机号:用于识别该网络中的主机. 其中A类分配给政府机关使用,B类地址给大中型企业使用,C类地址给个人使用.这 ...

  2. [转帖]Nginx动静分离详解以及配置

    https://developer.aliyun.com/article/885602?spm=a2c6h.24874632.expert-profile.314.7c46cfe9h5DxWK 简介: ...

  3. [转帖]2.20 Native Operating System Tools

    https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr020.html#BABBHHIE 2.20  ...

  4. Nginx 系列 | (转)Nginx 上传文件:client_max_body_size 、client_body_buffer_size

    原文:http://php-note.com/article/detail/488 client_max_body_size client_max_body_size 默认 1M,表示 客户端请求服务 ...

  5. killall 以及 pkill 等命令

    https://zhidao.baidu.com/question/1500084252693125099.html // 通过 killall 命令killall nginx// 通过 pkill ...

  6. Oracle 提示 用户在线,无法删除的清理方法

    查找删除策略. select username,sid,serial# from v$session where username='FSSCDEC004'; alter system kill se ...

  7. java 调优需要关闭的组建

  8. OpenEuler2203安装Redislabs的简单记录

    OpenEuler2203安装Redislabs的简单记录 背景 操作系统国产化的需求下 想着都转型到openEuler上面来. 应用和容器都没什么问题了,现在考虑一下一些企业软件 最近一直在想研究一 ...

  9. rel分支合并进入dev分支有冲突怎么处理?

    rel分支合并进入dev分支有冲突怎么处理? 切换到本地rel 拉取远端rel 切换本地dev 拉去远端dev git merge rel 会出现冲突 解决后 推送到远端就可以

  10. docker 推送镜像到harbor

    服务器A的镜像要推送到已安装harbor的服务器B 1.修改服务器A的/etc/docker/daemon.json文件 其中,http://211.131.241.221:8888为你要推送的服务器 ...