找一个无序数组第m大的数的算法

时间:2022-10-30 22:02:50

在一个个数为n的无序数组中找第m大的数,基本思想无非还是排序的思想,只不过需要我们稍微对现有的排序算法做些改动。

首先最简单的冒泡,插入排序,我们可以先直接排序,然后遍历到第m大的数,这个复杂度应该就是O(n^2),稍微想一下,我们好像还可以只维护一个大小为m的数组用来存储前m大的数,这样复杂度就降低了一些,变成了O(n*m)。关于冒泡,插入,至今我只想出这两个算法,如有其他好的算法欢迎分享。


接下来是堆排序,根据堆排序的过程,显示初始化O(n),然后重复一个过程,就是 1,取堆顶,2,产生新的堆顶。 这样我们当找到第m大的书以后,以后就不用再找了,所以,对于堆排序,我们的算法复杂度可以降到O(k*logn)。


最后是利用快排的思想,我们知道快排是在每一层都是排n个数,既然我们这里要求求第m大的数,所以其他的数的顺序我们就不关心了,因此,我们每一次排完一层以后,先拿着中间数(就是快排中将数组分成两部分的那个数)的位置与m比较是大是小,然后抛弃一边,只排剩下的一边,这样我们的算法的时间复杂度就大大降低。

假设k=logn,那么在我们快排算法的理想环境下,我们发现我们的时间复杂度是O(1+2+4+....+2^k),也就是O(2*n)=O(n)。


因此,我们发现在求一个无序数组的第m大的数时,可以做出比排序更好的算法,而我目前所能想到的最好的算法就是利用快排思想的那个算法。