#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;
}
codeup 5067 求第k大數 (犯錯太多)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.