排序算法

十大排序算法可分为两类:
比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。
非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。在这里插入图片描述在这里插入图片描述
计数排序:第一次循环遍历数组,对每个值计数;第二次循环遍历每个值,形成排序数组。k为值个数。适用于值在一定可数范围,如公司员工年龄

桶排序:第一次循环遍历数组,对应值放入桶;第二次循环遍历每个桶,桶内排序,一般桶内值较少,可直接用插入,或者桶递归。最坏情况是全分入一个桶。对于相同数量的数据,桶的数量越多,数据分散得越平均,桶排序的效率越高,可以说,桶排序的效率是空间的牺牲换来的。
对于N个待排数据,M个桶,平均每个桶[N/M]个数据的桶排序平均时间复杂度为:O(N+C),其中C=N*(logN-logM)
O(N)+O(M*(N/M)log(N/M))=O(N+N(logN-logM))=O(N+NlogN-NlogM)
当N=M时,即极限情况下每个桶只有一个数据时。桶排序的最好效率能够达到O(N)。
当然桶排序的空间复杂度为O(N+M),如果输入数据非常庞大,而桶的数量也非常多,则空间代价无疑是昂贵的。计数排序相当于每个桶存个数,而现在每个桶存多个数字。
上方表平均时间是O(N+C),最好是O(N),空间是O(N+M)

基数排序:每一位计数排序;k为最大位数

冒泡和选择排序最慢,很少用

插入排序比冒泡快两倍,用于数据少,重复少

Shell排序比插入排序大致快2倍。Shell排序比起快速排序,归并排序,堆排序慢很多。但shell算法比较简单,特别适合数据量在5000以下且性能要求不是很高的场合。
希尔:{1,2,4,8,…}这种序列并不是很好的增量序列,使用这个增量序列的时间复杂度(最坏情形)是O(n^2)
Hibbard提出了另一个增量序列{1,3,7,…,2k-1},这种序列的时间复杂度(最坏情形)为O(n1.5)
Sedgewick提出了几种增量序列,其最坏情形运行时间为O(n^1.3),其中最好的一个序列是{1,5,19,41,109,…}

归并排序合并排序比堆排序稍微快一点,由于它需要一个额外的数组,因此需要比堆排序多一些内存空间。
归并排序应该算是链表排序最佳的选择了,保证了最好和最坏时间复杂度都是nlogn,而且它在数组排序中广受诟病的空间复杂度在链表排序中也从O(n)降到了O(1)。

快速排序:一般情况下,没有比它更快的

堆排序:不需要大量的递归或者多维的暂存数组,因此这对于数据量非常巨大的序列是很合适的,比如超过数百万条记录,因为快速排序,归并排序都使用递归来设计算法,在数据量非常大的时候,可能会发生堆栈溢出错误。
一个节点的左节点是其父节点下标的2k+1,右节点是其父节点下标的2K+2
一般升序采用大顶堆,降序采用小顶堆

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值