最近有一个java大神,是蚂蚁支付宝的哦,问了我这么一个问题。我的回答是先将数组分解成两百个小数组或者更多,在开两百个thread进行排序,取最大,然后对这两百个数进行排序,取前三。其实我的思路根本就没有涉及到算法层面,也只是暴力破解。其实这不是最好的做法,因为这样会严重的浪费资源,然后他的回答是堆排序。我的问题是堆排序是怎样实现的,最好用代码体现出来。
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
取前三为什么要排序?新开辟三个变量的空间保存中间结果就行了。
这种方法的复杂度是
O(nk),n是数据总量,k是要获取的数据数量。排序无论是堆排还是快排都是O(nlogn)。当k小于log(2, 10 ** 8)时还是有优势的,太大了就退化成插入排序了。这不是典型的Top k问题吗,你可以百度一下Top K
topn的如果说稳妥的答案堆排是没有错的 问题是这个3取的。。。这么小的数
就是堆排序a
topk求解
如果想要最快,我觉得位图排序是我见过的最快的了。