codeup 5067 求第k大數 (犯錯太多)

#include <cstdio>
#include <cstdlib>
#include <ctime>

const int maxN = 1000010;
int n,k;
int datas[maxN];
int tools[maxN];

int getSite_divide(int l,int r)
{
	int site = rand()%(r-l+1) + l;
	int temp = datas[site];
	int ti = l,tj = r;
	for(int i = l;i <= r;i++){							//error 沒用i++,相當於忽略了 ddatas[i] == temp 的情況 
		if(datas[i] > temp)	tools[ti++] = datas[i];		//error 沒用if,用了while,並用的是i++而非i,可能多+ 
		if(datas[i] < temp)	tools[tj--] = datas[i];		//error 沒用if,用了while 
	}
	
	for(int i = 0;i <= r;i++){
		if(i < ti)			datas[i] = tools[i];
		else if(i <= tj){	
			datas[i] = temp;
			site = i; 									//error:沒改site 
		} 
		else				datas[i] = tools[i];
	}
	return site;										//error:沒改site 返回劃分之後temp元素所在的位置。 
}

//在[l,r]中找第 K 大的元素。 
int find_k(int l,int r,int K)
{
	//設置出口: 
	if(l >= r)	return datas[l];						//l >= r 時一定 M == K 
	
	//隨機定一個元素作爲目標元素,比較其與 k 的位置。
	int m = getSite_divide(l,r);
	int M = m - l + 1;
	if(M == K)		return datas[m];
	else if(M < K)	find_k(m+1,r,K-M);					//error 沒有用 K-M,裏面的邏輯關係自己想 
	else			find_k(l,m-1,K);
}

int main()
{
	//讀入數據 + init
	scanf("%d %d",&n,&k);
	for(int i = 0;i < n;i++)	scanf("%d",&datas[i]);
	srand((unsigned)time(NULL));
	
	
	//找出目標元素
	int show = find_k(0,n-1,k);
	
	//輸出:
	printf("%d",show);
	return 0;
}

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