笔试题:乱序求第n大(小)的数。我能想到的最好的方法。

#include <iostream>using namespace std;//当然用快速排序也是一样的。class Heap{public:Heap(){}void Insert(int a[],int len,int N){data = new int[N];size = N;for(int i=0;i<N;i++){data[i]=a[i];}int n = N/2;while(n>=0){SetVal(data,n);n–;}for(int i=N;i<len;i++){if(data[0]>a[i]){data[0]=a[i];SetVal(data,0);}}}void SetVal(int a[],int n){int i = n;int j = i*2+1;while(j<size){if(j+1<size && data[j]<data[j+1])j=j+1;if(data[i]<data[j]){int temp = data[i];data[i] = data[j];data[j] = temp;}i = j;j = i*2+1;}}int GetNum(){return data[0];}~Heap(){if(data)delete []data;}private:int *data;int size;};int find_n_min(int a[],int n,int val){ Heap hp;//我使用的大堆求解的,虽然是大堆,我却将较小的数插入,,//然后在这一组较小的数里面,按照大堆的升序方式,让第一个下标的位置保存我需要找到的值。 hp.Insert(a,n,val);return hp.GetNum();}int main(){int a[]={2,3,4,5,6,11,2,3,3,4,4,5,5,6,0,0,0};cout<<find_n_min(a,sizeof(a)/sizeof(int),4)<<endl;return 0;}

版权声明:本文为博主原创文章,未经博主允许不得转载。

人生没有彩排,每天都是现场直播。

笔试题:乱序求第n大(小)的数。我能想到的最好的方法。

相关文章:

你感兴趣的文章:

标签云: