首页 > 代码库 > 数据结构-各类排序算法总结[结局]

数据结构-各类排序算法总结[结局]

各类排序算法总结

.分配类排序->基数排序:

基数排序是一种借助于多关键码排序的思想,是将单关键码按基数分成多关键码进行排序的方法。基数排序属于低位优先排序法,通过反复进行分配收集操作完成排序.

对于数字型或字符型的单关键字,可以看成是由多个数位或多个字符构成的多关键字,

此时可以采用这种分配-收集的办法进行排序,称作基数排序法。其好处是不需要进行关键字间的比较。

例如:对下列这组关键字{278, 109, 063, 930, 589, 184, 505, 269, 008083 },首先按其个位数取值分别为0, 1, …9“分配10 组,之后按从的顺序将它们收集在一起;然后按其十位数” 取值分别为0, 1, …9“分配10 组,之后再按从的顺序将它们收集在一起;最后按其百位数重复一遍上述操作,便可得到这组关键字的有序序列。

在计算机上实现基数排序时,为减少所需辅助存储空间,应采用链表作存储结构,即链式基数排序,具体作法为:

(1)待排序记录以指针相链,构成一个链表;

(2)“分配时,按当前关键字位所取值,将记录分配到不同的链队列中,每个队列中记录的关键字位相同;

(3)“收集时,按当前关键字位取值从小到大将各队列首尾相链成一个链表;

(4)对每个关键字位均重复(2)(3)两步。

 

【性能分析】

(1)空间效率:链式基数排序空间复杂度为O(rd)

(2)时间效率:基数排序的时间复杂度为O(d(n+rd))

其中,分配为O(n); 收集为O(rd)(rd ”), d 分配-收集的趟数。

(3)稳定性:基数排序是一个稳定的排序方法。

 

各种内部排序算法的比较

1、时间性能

1)按平均的时间性能来分,有三类排序方法:

时间复杂度为O(nlogn)的方法有:快速排序堆排序归并排序,其中以快速排序为最好;

时间复杂度为O(n^2)的有:直接插入排序起泡排序简单选择排序,其中以直接插入为最好,特别是对那些对关键字近似有序的记录序列尤为如此;

时间复杂度为O(n)的排序方法只有基数排序

2)当待排记录序列按关键字顺序有序时,直接插入排序起泡排序能达到O(n)的时间

复杂度;而对于快速排序而言,这是最不好的情况,此时的时间性能蜕化为O(n^2),因此是应该尽量避免的情况。

3简单选择排序堆排序归并排序的时间性能不随记录序列中关键字的分布而改变。

 

2、空间性能

1)所有的简单排序方法(包括:直接插入、起泡和简单选择)和堆排序的空间复杂度为O(1)

2)快速排序为O(logn),为栈所需的辅助空间;

3)归并排序所需辅助空间最多,其空间复杂度为O(n);

4)链式基数排序需附设队列首尾指针,则空间复杂度为O(rd)

 

3、排序方法的稳定性能

当对多关键字的记录序列进行LSD(基数排序)方法排序时,必须采用稳定的排序方法。

快速排序和堆排序是不稳定的排序方法。

多数情况下,排序是按记录的主关键字进行的,此时不用考虑排序方法的稳定性.如果排序是按照记录的次关键字进行的,则应充分考虑排序方法的稳定性.

 

 

4、各种排序方法的综合比较和选择

1)各种排序方法的比较如表。

 

2)选择

选择排序方法时需要考虑的因素有:待排序的记录个数n;记录本身的大小;关键字的

分布情况;对排序稳定性的要求;语言工具的条件;辅助空间的大小。

依据这些元素,可以得到以下几点结论:

待排序的记录数目较小时,则采用插入排序简单选择排序

若待排序记录按关键字基本有序,则宜采用直接插入排序冒泡排序;直接插入排序是最佳的排序方法,常与快速排序,归并排序等其他排序方法综合使用.

③当很大且关键字的位数较少时,采用链式基数排序较好;

④若较大,则应采用时间复杂度为O(nlogn)的排序方法:快速排序堆排序归并排序