排序优化:如何实现一个通用的、高性能的排序函数

本文是学习算法的笔记,《数据结构与算法之美》,极客时间的课程

如何实现一个通用的、高性能的排序函数?

如何选择合适的排序算法?

如果要实现一个通用的、高效率的排序函数,我们应该选择哪种排序算法?我们先回顾一下前面讲过的几种排序算法。

我们前面讲过的,线性排序的时间复杂度较低,适用场景比较特殊,所以如果写一个通用的排序函数,不能选择线性排序算法。

如果对小规模进行排序,可以选择时间复杂度是O(n^2)的算法;如果对大规模的数据进行排序,时间复杂度是O(nlogn)的算法更加高效。所以,为了兼顾任意规模的数据的排序,一般都会首选时间复杂度是O(nlogn)的排序算法来实现排序函数。

时间复杂度是O(nlogn)的排序算法不止一个,我们已经讲过的有归并排序、快速排序,后面讲堆的时候,还会讲到堆排序。堆排序和快速排序都有比较多的应用,比如Java语言采用堆排序来实现排序函数,C语言使用快速排序实现排序函数。

快速排序比较适合实现排序函数,但是,我们也知道,快速排序在最坏情况下时间复杂度是O(n^2)如何来解决这个“复杂度恶化”的问题呢?

如何优化快速排序?

前面讲过,快速排序,每次分区点都选择最后一个数据。如果数据原来就是有序的或者接近有序,那时间复杂度就退化为O(n^2)。为了提高排序算法的性能,我们也要尽可能的让每次分区都比较平均。

这里介绍两个比较常用、比较简单的分区算法,你可以直观的感受下。

1、三数取中法
我们从区间的首、尾、中间,分别取出一个娄,然后比大小,取这3数的中间值作为分区点。但是,如果要排序的数组比较大,那“三娄取中”可能就不够了,可能要“五数取中”或者“十数取中”。

2、随机法
随机法就是每次从要排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值