如何使用c++实现查找数组中第N大的数
的有关信息介绍如下:
排序和查找是使用到最多的算法,对于普通的冒泡、选择排序等,与数据大小成指数级别,对于大数据排序性能不太好。
其中经典面试题:如何在一大堆数(大数据)中找到第N大的数据?
如果使用排序算法,性能不是太好。本文介绍如何使用c++中容器来实现该功能。
实现思路:优先队列能根据元素的优先级进行排序,查找大数据中第N大的数,首先将N个数添加到优先队列中。之后继续遍历所有数据,并与优先队列中最小的数进行比较,如果遍历数据大于优先队列中最小数,则将数据添加到优先队列中,并删除最小数据。
所以,我们需要使用首个元素最小的升序队列。
对于大数据中前N个数,我们直接添加到队列中,填满队列。
继续遍历大数据,并与优先队列首个元素进行比较。如果比首元素值大,则应该将该元素添加到队列中,并从队列中删除首元素。
最后,返回优先队列首元素即为大数据中第N大的数。
编写验证程序,构造一个数组,输出数组中第10大的数,程序运行正确。
实现思路与使用优先队列完全一致,为啥使用Set/Map呢?很多人大概只知道如何使用Set/Map关联容器,但对其内部实现不太了解。
Set/Map是有序的,它们底层依赖b树结构,插入、删除的效率要比顺序容器更高。
我们这里不考虑重复数据的问题,Set会进行剔重处理。
对于前N个数,我们直接插入到Set容器中。
Set默认按数据从小到大排序,继续遍历大数据,与Set首个元素比较。如果比首元素大,则插入大数据,并删除首元素。
最后,返回Set容器中首元素即为大数据中第N大的数。
修改验证程序,调用使用Set函数,与使用优先队列函数输出一致,从而相互验证程序正确。



