五、 基数排序( Radix Sort )
前面几种排序中我尽量不去区别“关键字”和“记录”的概念,这里不得不区分了,因为这是一类基于多个关键字对应于一个记录的排序方法。
5 . 1 多关键字排序
假设有n的记录 { R1, R2, ... Rn},其中每个记录又含有d个关键字 (K 0 , K 1 , ... K d-1 ) ,其中关键字优先级逐次降低:
第一种方法 :先对主关键字K 0 排序,将序列划分成若干子序列,每个子序列中都有相同的K 0 值,然后对每个子序列对 关键字K 1 排序,分成更小的若干子序列,依次重复至 对每个子序列对 关键字K d-1 排序, 然后将所有子序列联接成一个有序序列。
第二种方法 :与上相反, 依次以K d-1 ,K d-2 ... K 0 排序.
5 . 1 链式基数排序
基本思想: 有的逻辑关键字可以看成有若干个关键字复合而成,这是一种借助“分配”和“收集”两种操作对单逻辑关键字进行的一种内部排序。
举例:对一组数字(最大数为3位数, 不满3位的前面置0)排序,首先以静态链表存储n个待排记录,并令表头指针指向第一个记录;第一趟分配以个位数进行分成10个链队列(0,1...9),第一趟收集是改变所有的非空队列的队尾记录的指针域,令其指向下一个非空队列的队头记录,重新将10个队列中记录链成一个链表;接着第二趟分配和收集针对十位数....直到第三趟的分配和收集结束。
总结:
排序方法 | 平均时间 | 最坏情况 | 辅助存储 |
简单排序 | O ( n2 ) | O ( n2 ) | O ( 1 ) |
快速排序 | O ( n logn ) | O ( n2 ) | O ( logn ) |
堆排序 | O ( n logn ) | O ( n logn ) | O ( 1 ) |
归并排序 | O ( n logn ) | O ( n logn ) | O ( n ) |
基数排序 | O ( d ( n + rd)) | O ( d ( n + rd ) | O ( rd ) |