#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大(小)的數。我能想到的最好的方法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.