八种排序

本文是学习时的自我总结,用于日后温习。如有错误还望谅解,不吝赐教

此处附上内容所出博客:http://blog.csdn.net/hguisu/article/details/7776068

 

1. 插入排序:每次将一个待排序的元素,按照其大小插入到它之前已经排好序的子表的适当位置,直到全部有序

a)   直接插入排序:在R[1]至R[i-1]长度为i-1的子表有序的情况下,将第x个元素插入,得到R[i]到R[i]长度为i的子表有序。通过n-1趟后,R[1]到R[n]有序

b)   希尔排序:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高

 

2. 交换排序:

a)   冒泡排序:对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后它们的排序与排序要求相反时,就将它们互换。注:每一趟排序操作只能找到一个最大值或最小值,我们考虑利用在每趟排序中进行正向和反向两遍冒泡的方法一次可以得到两个最终值(最大者和最小者),从而使排序趟数几乎减少了一半。

b)   快速排序(挖坑填数+分治法):

1.先从数列中取出一个数作为基准数。

2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

3.再对左右区间重复第二步,直到各区间只有一个数。

先从后向前找,再从前向后找

关于快速排序,此处有详细解释:http://developer.51cto.com/art/201403/430986.htm

 

3. 选择排序:

a)   简单选择排序:在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。

简单排序的改进:二元选择排序。简单选择排序,每趟循环只能确定一个元素排序后的定位。可以改进为每趟循环确定两个元素(当前趟最大和最小记录)的位置,从而减少排序所需的循环次数。改进后对n个数据进行排序,最多只需进行[n/2]趟循环即可。

b)   堆排序:树形选择排序,是堆直接选择排序的有效改进。小顶堆中堆顶元素(即第一个元素)必为最小项。若以一维数组存储一个堆,则堆对应一棵完全二叉树,且所有非叶结点的值均不大于(或不小于)其子女的值,根结点(堆顶元素)的值是最小(或最大)的。

 

4. 归并排序:

将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

5. 基数排序:

桶排序:是将阵列分到有限数量的桶子里。每个桶子再个别排序。

 

选择排序算法的依据

影响排序的因素有很多,平均时间复杂度低的算法并不一定就是最优的。相反,有时平均时间复杂度高的算法可能更适合某些特殊情况。同时,选择算法时还得考虑它的可读性,以利于软件的维护。一般而言,需要考虑的因素有以下四点:

1.待排序的记录数目n的大小;

2.记录本身数据量的大小,也就是记录中除关键字外的其他信息量的大小;

3.关键字的结构及其分布情况;

4.对排序稳定性的要求。

 

设待排序元素的个数为n

1)当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。

a)   快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;

b)   堆排序:如果内存空间允许且要求稳定性的,

c)   归并排序:它有一定数量的数据移动,所以我们可能过与插入排序组合,先获得一定长度的序列,然后再合并,在效率上将有所提高。

2)当n较大,内存空间允许,且要求稳定性 =》归并排序

3)当n较小,可采用直接插入或直接选择排序。

    直接插入排序:当元素分布有序,直接插入排序将大大减少比较次数和移动记录的次数。

    直接选择排序 :元素分布有序,如果不要求稳定性,选择直接选择排序

5)一般不使用或不直接使用传统的冒泡排序。

6)基数排序

它是一种稳定的排序算法,但有一定的局限性:

a)   关键字可分解。

b)   记录的关键字位数较少,如果密集更好

c)   如果是数字时,最好是无符号的,否则将增加相应的映射复杂度,可先将其正负分开排序。

 

posted @ 2017-12-18 23:37  mflood  阅读(233)  评论(0编辑  收藏  举报