c++求区间第k大数_寻找最大的k个数,TopK有关问题的C++实现

寻找最大的k个数,TopK问题的C++实现

2亿个整数中求最大的100万之和

题目:有一个文件中保存了2亿个整数,每个整数都以' '分隔。求最大的100万个整数之和。

算法:

1. 首先建立一个容量为100万(nTop)的int数组,从文件读取整数填充。

2. 利用堆维护该100万条记录(确保堆顶元素为最小值)

3. 从文件中读取一个整数与堆顶元素比较,如果大于堆顶元素则替换该元素,并调整堆的结构。

4. 重复步骤3一直到数据读取完

5. 将数组中的元素全部相加,得到结果

参考源代码:

#include

using namespace std;

template

class CTopK

{

public:

CTopK();

~CTopK();

T* m_Data;

int GetTopK(const char* sFile, int& nTop);

private:

void Clear();

void HeapAdjust(int nStart, int nLen);

void BuildHeap(int nLen);

};

template

CTopK::CTopK()

{

m_Data = NULL;

}

template

CTopK::~CTopK()

{

Clear();

}

template

void CTopK::Clear()

{

if (NULL != m_Data)

{

delete[] m_Data;

m_Data = NULL;

}

}

//获取前top的k个数

template

int CTopK::GetTopK(const char* sFile, int& nTop)

{

FILE* fp = NULL;

T fData;

int i = 0;

//判断输入参数

if ( (NULL == sFile) || (nTop <= 0) )

{

cout << "error parameter" << endl;

return -1;

}

//清除操作

Clear();

//打开文件

fp = fopen(sFile, "r");

if (NULL == fp)

{

cout << "open file failed!" << endl;

return -1;

}

//分配空间

m_Data = new T[nTop];

if (NULL == m_Data)

{

cout << "new operator failed!" << endl;

return -1;

}

cout << "please wait..." << endl;

//读取前nTop个数据,注意数据的类型T

for (i = 0; i < nTop; i++)

{

if (EOF != fscanf(fp, "%d", &fData))

{

m_Data[i] = fData;

}

else

{

br

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值