排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。总体上说,排序算法有两种设计思路,一种是基于比较,另一种不是基于比较。
稳定性
算法稳定性简单来说,一组带排序的数中,有两个相同的数,假设为3(1),3(2)如果排序后3(1)仍在3(2)之前,我们称这个排序是稳定的。
分类
插入排序
选择排序
交换排序
归并排序
基数排序
。。。。。。
1.交换排序
冒泡排序
特点:稳定排序,原地排序空间复杂度O(1),时间复杂度O(N*N)
思想:将整个序列分为无序和有序两个子序列,不断通过交换较大元素至无序子序列首完成排序。
适用场景:当数据已经基本有序时
快速排序
特点:不稳定排序,原地排序,时间复杂度O(nlog2n)
思想:采用分治策略,将原问题分解成若干个规模更小,但结构与原问题相似的子问题。递归的解决这些子问题,然后将这些子问题的解组合为原问题的解。
适用场景:应用相当广泛
2.选择排序
直接选择
特点:不稳定排序,原地排序空间复杂度O(1),时间复杂度O(n2)
思想:将序列划分为无序和有序两个子序列,寻找无序序列中的最小(大)值和无序序列的首元素交换,有序区扩大一个,循环下去,最终完成全部排序。
适用场景:交换少
堆排序
特点:非稳定排序,原地排序空间复杂度O(1),时间复杂度O(nlog2n)
思想:小顶堆或者大顶堆
适用场景:不如快速排序广泛
3.插入排序
直接插入
特点:稳定排序,原地排序,时间复杂度O(N*N)
思想:将所有待排序数据分成两个序列,一个是有序序列S,另一个是待排序序列U,初始时,S为空,U为所有数据组成的数列,然后依次将U中的数据插到有序序列S中,直到U变为空。
适用场景:当数据已经基本有序时,采用插入排序可以明显减少数据交换和数据移动次数,进而提升排序效率。适合于链表存储。
希尔排序
特点:非稳定排序,原地排序,时间复杂度O(n^lamda)(1< lamda < 2), lamda和每次步长选择有关。
思想:增量缩小排序。先将序列按增量划分为元素个数近似的若干组,使用直接插入排序法对每组进行排序,然后不断缩小增量直至为1,最后使用直接插入排序完成排序。
适用场景:因为增量初始值不容易选择,所以该算法不常用。
4.归并排序
特点:稳定排序,非原地排序,时间复杂度O(N*N)
思想:首先,将整个序列(共N个元素)看成N个有序子序列,然后依次合并相邻的两个子序列,这样一直下去,直至变成一个整体有序的序列。
适用场景:外部排序
5.基数排序
特点:稳定排序,非原地排序,时间复杂度O(N)
思想:把每个数据看成d个属性组成,依次按照d个属性对数据排序(每轮排序可采用计数排序),复杂度为O(d*N)
适用场景:数据明显有几个关键字或者几个属性组成。
以上,是对排序算法的基本介绍,下面会继续深入的介绍。。。。。。