排序算法(C实现)------- 总结

来源:互联网 发布:java string 添加元素 编辑:程序博客网 时间:2024/06/16 04:04

          上面讨论的排序算法均是比较常用的,而且都属于内部排序,总结如下:

排序法

 平均时间

最差情形

稳定度

额外空间

备注

冒泡

 O(n2)

  O(n2)

 稳定

O(1)

n小时较好

直接插入

 O(n2)

 O(n2)

稳定

O(1)

大部分已排序时较好

希尔

O(nlogn)

O(ns) 1<s<2

不稳定

O(1)

s是所选分组

快速

O(nlogn)

O(n2)

不稳定

O(logn)

n大时较好

归并

O(nlogn)

O(nlogn)

稳定

O(n)

n大时较好

折半插入

 O(n2)

 O(n2)

稳定

O(1)

仅比插入排序减少了比较次数

简单选择

 O(n2)

 O(n2)

稳定

O(1)

n小时较好

O(nlogn)

O(nlogn)

不稳定

O(1)

n大时较好

基数

O(d(n+rd))

O(d(n+rd))

稳定

O(rd)

        多关键字排序

         (1 )从平均时间性能而言,快速排序最佳,所需时间最省,但快速排序在最坏情况下的时间性能不如堆排序和归并排序。而后两者相比较的结果是,在n很大时,归并排序所需时间较堆排序省,但它所需辅助存储量最多。

         (2 )  上表中的冒泡排序,简单选择排序,  直接插入排序,折半插入排序,其中以直接插入排序为最简单,当序列中的记录“基本有序”或n值较小时,它是最佳的排序方法,因此常将它和其他方法,诸如快速排序,归并排序等结合在一起使用。

         (3 )基数排序的时间复杂度也可以写成O(d*n)。因此,它最适用于n值很大而关键字较小的序列。若关键字也很大,而序列中大多数记录的“最高位关键字”均不同,则亦可先按“最高位关键字”不同将序列分成若干“小”的子序列,而后进行直接插入排序。

         (4 )从方法的稳定性来比较,基数排序是稳定的内部排序方法,所有时间复杂度为O(n2)的简单排序法(包括除希尔排序外的所有插入排序,冒泡排序和简单选择排序)也是稳定的,然而,快速排序,堆排序和希尔排序 等时间性能较好的排序算法都是不稳定的。

           综上所述,没有哪一种排序算法是绝对最优的,有的适用于n较大的情况,有的适用于n较小的情况,有的适用于多关键字的排序,有的.......,因此,在实际应用中需要根据不同情况适当选择相应的算法,甚至可将多种方法结合起来使用。

0 0
原创粉丝点击