筆試題:亂序求第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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章