数据结构中, 常用的算法有,交换排序(冒泡排序)、选择排序和插入排序,还有相应改进算法快速排序、堆排序和希尔排序。
简单的排序(交换排序、选择排序和插入排序),平均时间复杂度都是O(n^2) 即n平方,每一趟排序平均要查询n个元素。它们改进后的算法,快速排序、堆排序平均时间复杂度都是
希尔排序平均时间复杂度是:
这些算法的排序研究都是基于将所有元素都排序好的。但Top n只需要选出前几名最大或最小值。 那我们就在以上几种算法中,选择每趟都可以找到一个当前最大值的排序算法就好。以上算法都有两层循环,top n求解时,外层循环只需要运行指定次数, 如100个分数排名,找出前10名的, 则我们只需要要外循环运行10次。内循环,一般算法是运行n次,改进的算法是运行
。
从以上分析,可以选出:
交换排序(冒泡排序)、选择排序,堆排序。
那快速排序可不可以呢? 那是不可以的。因为快速排序一趟下来,能确定的是轴元素的最终位置,但轴元素却不是当前排序元素的最值元素。
所以以上列出的最高效的top n算法,就是堆排序了。它的空间复杂度是O(1)。
留个小问题,除了时间复杂度,空间复杂度外,关于编写代码多少的编码复杂度,小伙伴们有了解吗?
这可以关系到你写的代码精不精炼的评判标准。