排序

按是否涉及数据的内外存交换,  内部排序(记录个数不是很多的小文件) 外部排序(记录个数太多,不能一次将全部记录放入内存)

按策略划分 内部排序:

1、插入排序(直接插入排序、希尔排序)

2、交换排序(冒泡排序、快速排序)

3、选择排序(直接选择排序、堆排序)
4、归并排序

5、分配排序(桶排序,基数排序)

这里三个平均时间复杂度为n^2的排序(直接插入排序,冒泡,直接选择都是稳定的)。

常用的排序算法的时间复杂度和空间复杂度

 

排序法

最差时间分析 平均时间复杂度 稳定度 空间复杂度
冒泡排序 O(n2) O(n2) 稳定 O(1)
快速排序 O(n2) O(n*log2n) 不稳定 O(log2n)~O(n)
选择排序 O(n2) O(n2) 稳定 O(1)
二叉树排序 O(n2) O(n*log2n) 不一顶 O(n)

插入排序

O(n2) O(n2) 稳定 O(1)
堆排序 O(n*log2n) O(n*log2n) 不稳定 O(1)
希尔排序 O O 不稳定 O(1)

 

1、时间复杂度 

1:希尔排序http://blog.csdn.net/cjf_iceking/article/details/7951481

希尔排序:将无序数组分割为若干个子序列,子序列不是逐段分割的,而是相隔特定的增量的子序列,对各个子序列进行插入排序;然后再选择一个更小的增量,再将数组分割为多个子序列进行排序......最后选择增量为1,即使用直接插入排序,使最终数组成为有序。
增量的选择:在每趟的排序过程都有一个增量,至少满足一个规则 增量关系 d[1] > d[2] > d[3] >..> d[t] = 1 (t趟排序);根据增量序列的选取其时间复杂度也会有变化,这个不少论文进行了研究,在此处就不再深究;本文采用首选增量为n/2,以此递推,每次增量为原先的1/2,直到增量为1;
下图详细讲解了一次希尔排序的过程:

平均时间复杂度:希尔排序的时间复杂度和其增量序列有关系,这涉及到数学上尚未解决的难题;不过在某些序列中复杂度可以为O(n1.3);

空间复杂度:O(1)  

稳定性:不稳定

 
 

5:分配排序:http://yaochaosheng.iteye.com/blog/995021

http://blog.csdn.net/kesalin/article/details/6260286

桶排序是在分配排序的基础上为相同元素或在同一个范围内的元素分配同一个桶,因此每个桶可以看做一个变长的链表

基数排序是将元素分等级从最次级到最高级不断进行递进的排序过程。

分配排序的基本思想:排序过程无须比较关键字,而是通过用额外的空间来"分配"和"收集"来实现排序,它们的时间复杂度可达到线性阶:O(n)。简言之就是:用空间换时间,所以性能与基于比较的排序才有数量级的提高!

 

排序算法基本操作:

比较关键字大小;改变指向记录的指针或者 移动记录本身。

待排序文件常用存储方式:

1)顺序表,对记录本身进行物理重排

2)链表,无需移动记录,修改指针。链式排序。

3)用顺序方式存储待排序的记录,但同时建立一个辅助表(包含关键字和指向记录位置的指针 组成的索引表)。

  只对辅助表 进行物理重排。使用与难于在链表上实现,又需避免移动记录的排序方法。

 

posted @ 2014-07-14 13:00  xaf_dfg  阅读(207)  评论(0编辑  收藏  举报