1. 程式人生 > >由無序陣列中找到第K 大的元素

由無序陣列中找到第K 大的元素

當然如果我們想要實現這個問題會有很多思路,可以將原來的陣列進行排序即可,直接隨機訪問到第K個元素即可。

我們專門寫一篇部落格當然不是想利用這種思路的,可以試試改進的快速排序啊,對不,我個人覺得是利用了兩種思路一個是快速排序一個是二分查詢,在進行快速排序的時候,在指定範圍內找到該值的下標,如果該下標與K值相比比較大,則結束end=index-1,相反的話  start=index+1即可

當然因為是第K大,所以陣列應該是降序排列的

int a[]={7,9,8,5,6,3,2,4,1,0};
const int K=6;
//解題思路就是利用快速排序,如果得到快速排序一次中間結果之後其所在位置即在
int QSort(int* a,int low,int high)
{
	if(low<high)
	{
		int start=low,end=high;
		int key=a[start];
		while(start<end)
		{
			while(start<end&&a[end]<key)
			{
				end--;
			}
			a[start]=a[end];
			while(start<end&&a[start]>key)
			{
				start++;
			}
			a[end]=a[start];			
		}
		a[start]=key;
		return start;
	}
	return -1;
}
int main()
{
	int start=0,end=sizeof(a)/sizeof(int)-1;
	int index=0;
	while(index!=K)
	{
		index=QSort(a,start,end);
		if(index<K)
		{
			start=index+1;
		}
		else if(index>K)
		{
			end=index-1;			
		}
	}
	cout<<a[index]<<"即為所求\n";
}

由此還可以引申出另一個 問題的解決方案,,也即最小的K個數

其思路就跟快速排序是一樣的,只是將陣列進行升序排列,然後,找到位於第K小的元素,那麼該元素之前的所有元素都比這個小,也就找到了最小的K個元素,但是不一定是排序的