Ruby 数据结构与算法:归并排序、快速排序、树、堆和堆排序
1. 归并排序和快速排序
归并排序和快速排序是两种常见的排序算法,它们各有优缺点。
1.1 归并排序
归并排序是一种快速排序算法,其最好、最坏和平均情况的时间复杂度均为 O(n log n)。然而,它需要 O(n) 的额外空间来完成排序工作。这是因为在不使用额外空间的情况下合并列表既麻烦又缓慢。
归并排序的递归在子列表为空或大小为 1 时停止,因为这样的列表已经是有序的,无需再进行排序操作。
1.2 快速排序
快速排序的最好和平均情况时间复杂度为 O(n log n),但最坏情况的时间复杂度为 O(n²)。不过,通过采用三数取中法改进,可以降低最坏情况发生的可能性。但快速排序在处理有一定顺序的数据时,仍然可能表现不佳。尽管如此,对于通过键比较来排序随机数据,快速排序仍然是已知最快的算法。
快速排序中的枢轴值是被排序列表中的一个元素,它被选作重新排列(分区)列表的基础。所有小于枢轴的元素被放置在其左侧,所有大于枢轴的元素被放置在其右侧。(相等的值可以放在枢轴的左侧或右侧,不同的分区算法可能会做出不同的选择)。
为了改进快速排序,提出了以下几种方法:
- 使用列表中第一个、最后一个和中间元素的中位数作为枢轴值。
- 对小的子列表使用插入排序。
- 用栈代替递归。
- 先对小的子列表进行排序,以减少递归深度(或栈的大小)。
尽管快速排序有最坏情况的不佳表现,但它仍然被广泛使用,因为其平均性能非常好。通常,快速排序的运行时间约为其他排序算法的一半,特别是在采用了
超级会员免费看
订阅专栏 解锁全文
9

被折叠的 条评论
为什么被折叠?



