为什么从5000个数中找出10个最大的堆排序最快?
csdn有篇帖子是说"从5000个数中找出10个最大的用哪种排序最快",答案是堆排序. 我开始认为是选择排序,因为从 第一次需要比较 5000次,第二次比较4999次... 用选择排序需要比较 5000+4999+4998+.....这么多次, 就是每次都把剩下没有比较的数字进行一次一次比较得到前10个最大的,难道用堆比较就不用一个一个比较数字吗? 用堆比较首先要建立这个堆,是个很麻烦的过程,是不是建立这个堆的过程就把前 10个最大的数字找出来了?
我看网上说:"直接选择排序中,为了从R[1..n]中选出关键字最小的记录,必须进行n-1次比较,然后在R[2..n]中选出关键字最小的记录,又需要做n-2次比较。事实上,后面的n-2次比较中,有许多比较可能在前面的n-1次比较中已经做过,但由于前一趟排序时未保留这些比较结果,所以后一趟排序时又重复执行了这些比较操作.堆排序可通过树形结构保存部分比较结果,可减少比较次数。".
他这段话不理解的是:"堆排序可通过树形结构保存部分比较结果"? 下次找最大的就不用比较这些了?
具体是为什么啊? 时间复杂度是多少?请帮忙分析一下为什么这种情况下堆排序比其他排序快