人类的发展中,咱们学会了计数,好比知道小明今天打猎的兔子的数量是多少。另一方面,咱们也须要判断,今天哪一个人打猎打得多,咱们须要比较。算法
因此,排序这个很天然的需求就出来了。好比小明打了5只兔子,小王打了8只,还有部落其余一百多我的也打了。咱们要论功行赏,谁打得多,谁就奖赏大一点。编程
如何排序呢,怎么在最快的时间内,找到打兔子最多的人呢,这是一个很朴素的问题。segmentfault
通过不少年的研究,出现了不少的排序算法,有快的有慢的。好比:数组
它们的复杂度以下:数据结构
稳定性概念
定义:能保证两个相等的数,通过排序以后,其在序列的先后位置顺序不变。(A1=A2,排序前A1在A2前面,排序后A1还在A2前面)
意义:稳定性本质是维持具备相同属性的数据的插入顺序,若是后面须要使用该插入顺序排序,则稳定性排序能够避免此次排序。
冒泡排序能够说是最差的排序算法。并发
咱们把冒泡排序,直接选择排序,直接插入排序认为是初级的排序算法,其中直接插入排序的性能是综合最好的,通常来讲,当排序数组规模n
较小时,直接插入排序可能比任何排序算法都要快,建议只在小规模排序中使用。数据结构和算法
希尔排序是对直接插入排序的改进版本,比直接选择排序和直接插入排序快,且随着规模的递增,这种性能提高越明显。由于算法容易理解,在排序数组中等规模下,咱们可使用它。在很是大的规模下,它的性能也不那么糟糕,但大规模排序仍是建议使用如下的高级排序算法。函数
快速排序,归并排序和堆排序是比较高级的排序算法。性能
目前被认为综合最好的高级排序算法是快速排序,快速排序的平均用时最短,大多数的编程库内置的排序算法都是它。spa
堆排序也是一种很快的排序算法,经过维持一颗二叉树,树的根节点老是最大或最小从而可实现排序。
归并排序和快速排序同样使用分治法,递归地先使每一个子序列有序,再将两个有序的序列进行合并成一个有序的序列。
咱们在这一章将会讲解不一样的排序算法。
我是陈星星,欢迎阅读我亲自写的 数据结构和算法(Golang实现),文章首发于 阅读更友好的GitBook。