一、插入排序:稳定,时间复杂度O(n^2)

想象你在打扑克牌,一開始左手是空的,接着右手開始从桌上摸牌,并将其插入到左手的一把牌中的正确位置上。为了找到这个正确位置,我们须要从右到左将它与手中的牌比較,直到找到合适的位置插入。整个过程的特点是,左手的牌是排好序的了。

详见: 插入排序

二、选择排序:不稳定,时间复杂度O(n^2)

每趟从未排序部分选出最小的元素。然后通过交换将其加入到已排序部分中。

详见: 选择排序

三、冒泡排序:稳定,时间复杂度O(n^2)

将待排序的元素看作是竖着排列的“气泡”。较小的元素比較轻。从而要往上浮。在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。

假设发现两个相邻元素的顺序不正确。即“轻”的元素在以下,就交换它们的位置。显然。处理一遍之后,“最轻”的元素就浮到了最高位置;处理两遍之后。“次轻”的元素就浮到了次高位置。在作第二遍处理时,由于最高位置上的元素已是“最轻”元素,所以不必检查。

一般地。第i遍处理时,不必检查第i高位置以上的元素。由于经过前面i-1遍的处理,它们已正确地排好序。

详见: 冒泡排序

四、归并排序:稳定。时间复杂度 O(nlog n),空间O(n)

分解:将n个元素分成各含n/2个元素的子序列。

解决:用归并排序法对两个子序列递归地排序。

合并:合并两个已排序的子序列以得到排序结果。

合并思想:

桌面上有两堆已排好序的牌(比方最上面的牌最小),牌面朝上。

我们的任务是将两堆牌合并成一堆有序的牌。

以下開始取牌:从两堆牌顶上的两张牌中选取较小的一张,将其取出,面朝下放到输出堆中。假设重复取牌直到当中一堆牌为空,接下来仅仅要把剩下那堆牌(假设有的话)的全部牌都取出并放到输出堆中就可以。

详见: 归并排序

五、堆排序:不稳定,时间复杂度 O(nlog n)

堆排序是一种树形选择排序,在排序过程中。将A[n]看成是全然二叉树的顺序存储结构,利用全然二叉树中双亲结点和孩子结点之间的内在关系来选择最大的元素。

详见: 堆排序

六、高速排序:不稳定,时间复杂度 平均O(nlog n),最差O(n^2)。空间O(log n)->递归的栈空间

快排基于分治模式。其基本思想:

分解:从序列中取出一个数作为基准数,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边,从而得到两个子序列。

解决:递归调用高速排序。对两个子序列进行排序。

合并:由于子序列是就地排序的,所以合并不须要不论什么操作。

详见: 高速排序

七、希尔排序:不稳定。时间复杂度 平均O(nlogn),最差O(n^s) 1 < s < 2

在直接插入排序算法中。每次插入一个数。使有序序列仅仅添加1个节点。而且对插入下一个数没有提供不论什么帮助。假设比較相隔较远距离(称为 增量)的数,使得数移动时能跨过多个元素,则进行一次比較就可能消除多个元素交换。D.L.shell于1959年在以他名字命名的排序算法中实现了这一思想。算法先取某个增量d,全部距离为d的倍数的记录放在同一个组中。先在各组内进行直接插入排序,然后再用一个较小的增量对它分组,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组。排序完毕。

八、计数排序:稳定,线性时间

计数排序假设n个输入元素都是0到k之间的整数,基本思想是对每一个元素x。确定出小于x的元素个数。之后便能够将x直接放到合适的位置。(需注意元素相等的情况)

详见: 计数排序

八、基数排序:稳定,线性时间

我们要对一副扑克牌排序,能够这样做:先无论牌的大小,先对花色(比方红桃、黑桃、方块、梅花)排序。之后再依据牌的大小排序。于是一副牌就按花色、大小排好了。

对于数字。我们能够先对最低位排序,再对次低位排序。。最后对最高位排序。

详见: 基数排序

八、桶排序:稳定。线性时间

假设全部元素均匀分布在区间[0,1)上,将该区间划分成n个同样大小的子区间(称为桶),之后。将相应的元素放到相应范围的桶里面,对各个桶里的元素进行排序,最后按次序把各个桶里的元素列出来就可以。

桶排序非常快。大多时候比快排还快。只是非常耗费空间。

详见: 桶排序

各个算法都有其适用的情况,所以没有绝对的优劣之分,详细问题要详细分析。

要是有人问你,哪个排序算法最好。千万别往坑里跳。o(^▽^)o


以下提一下一些有趣的排序:

位图排序

(以下是并行化的排序算法)

双调排序(Bitonic Sort)

奇偶排序(Odd-even Sort)

採样排序(Sample Sort)


每天进步一点点,Come on!

(●’◡’●)

本人水平有限,如文章内容有错漏之处,敬请各位读者指出,谢谢!

【每日算法】排序算法总结(复杂度&amp;稳定性)的更多相关文章

  1. [数据结构与算法]排序算法(Python)

    1.直接插入排序 给定一个数组后,从第二个元素开始,如果比第一个小,就跟他交换位置,否则不动:第三个元素如果比第二个小,把第三个跟第二个交换位置,在把第二个与第一个比较:..... def inser ...

  2. 数据结构与算法---排序算法(Sort Algorithm)

    排序算法的介绍 排序也称排序算法 (Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程. 排序的分类 1) 内部排序: 指将需要处理的所有数据都加载 到内部存储器(内存)中进 ...

  3. python 经典排序算法

    python 经典排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算 ...

  4. 常见排序算法总结与分析之交换排序与插入排序-C#实现

    前言 每每遇到关于排序算法的问题总是不能很好的解决,对一些概念,思想以及具体实现的认识也是模棱两可.归根结底,还是掌握不够熟练.以前只是看别人写,看了就忘.现在打算自己写,写些自己的东西,做个总结.本 ...

  5. 经典排序算法(PHP)

    1.冒泡算法,排序算法,由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序 function maopao_fun($array){ $count = count($arr ...

  6. C++进阶 STL(3) 第三天 函数对象适配器、常用遍历算法、常用排序算法、常用算数生成算法、常用集合算法、 distance_逆序遍历_修改容器元素

    01昨天课程回顾 02函数对象适配器 函数适配器是用来让一个函数对象表现出另外一种类型的函数对象的特征.因为,许多情况下,我们所持有的函数对象或普通函数的参数个数或是返回值类型并不是我们想要的,这时候 ...

  7. 排序算法大汇总 Java实现

    一.插入类算法 排序算法的稳定性:两个大小相等的元素排序前后的相对位置不变.{31,32,2} 排序后{2,31,32},则称排序算法稳定 通用类: public class Common { pub ...

  8. python 排序算法总结及实例详解

    python 排序算法总结及实例详解 这篇文章主要介绍了python排序算法总结及实例详解的相关资料,需要的朋友可以参考下 总结了一下常见集中排序的算法 排序算法总结及实例详解"> 归 ...

  9. C++:主要几种排序算法及其复杂度

     常见排序算法稳定性和复杂度分析快速简记以及转载 分类: 算法 2012-02-07 22:18 399人阅读 评论(1) 收藏 举报 算法mergeshell http://blogold.chin ...

随机推荐

  1. JAVA——不简单的fianl关键字

    protected用来修饰 域,代表域的访问权限是:包权限 或者 不同包,但是是子类 : final 修饰常量只要是该常量代入的计算式,在编译时期,就会被执行计算,以减轻运行时的负担.(只对基本数据类 ...

  2. 【Linux】 CentOS免密登录

    #sudo ssh-keygen -t rsa #sudo ssh-copy-id ${ipAddress}

  3. bzero - 向字符串写入零

    总览 (SYNOPSIS) #include <string.h> void bzero(void *s, size_t n); 描述 (DESCRIPTION) bzero() 函数 把 ...

  4. zeng studio的项目窗口PHP Explorer

    恢复zeng studio的项目窗口PHP Explorer方法: Windows>show view >PHP Explorer

  5. 【PS切图】前端工程师必备,但又无需精通的一项技能。

    前端主要从事一些代码开发工作,PS使用是前端工程师必备,但又无需精通的一项技能. 前端切图四大面板:在“窗口”菜单下开启 1,信息(手动开启)2,字符(手动开启)3,历史记录(手动开启)4,图层(默认 ...

  6. JS、CSS、Image预加载

    Image预加载 <div class="hidden"> <script type="text/javascript"> var im ...

  7. [LUOGU] P3354 [IOI2005]Riv 河流

    题目描述 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海.这条大河的入海口处有一个村庄--名叫 ...

  8. laydate组件选择时间段的判断

    前言: 在使用laydate组件的时候,难免会遇到选择时间段,官网给的文档中有选择时间段的组件,但是并不好用,首先只能选择一个月的时间段,有局限性,其次精确到时间的话要先选日期范围再选时间范围,很变态 ...

  9. 零基础入门学习Python(27)--集合:在我的世界里,你就是唯一

    知识点 集合:set set和dict类似,也是一组key的集合,但不存储value.由于key不能重复,所以,在set中,没有重复的key. 集合中的元素的三个特征: 1)确定性(元素必须可hash ...

  10. Python Pandas库的学习(二)

    今天我们继续讲下Python中一款数据分析很好的库.Pandas的学习 接着上回讲到的,如果有人听不懂,麻烦去翻阅一下我前面讲到的Pandas学习(一) 如果我们在数据中,想去3,4,5这几行数据,那 ...