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

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



