以下**可以從陣列a中找出第k小的元素。它使用了類似快速排序中的分治演算法,期望時間複雜度是o(n)的。請仔細閱讀分析原始碼,填寫劃線部分缺失的內容。
#include
#include
intquick_select
(int a,
int l,
int r,
int k)
int i = l, j = r;
while
(i < j)
while
(i < j && a[j]
> x) j--;if
(i < j)
} a[i]
= x;
p = i;
if(i - l +
1== k)
return a[i];if
(i - l +
1< k)
return
quick_select
( __________________ )
;//填空
else
return
quick_select
(a, l, i -
1, k);}
intmain()
;printf
("%d\n"
,quick_select
(a,0,14
,5))
;return0;
}
無
填空答案為:a,i+1,r,(k-i+l-1)
int
main()
;printf
("%d\n"
,quick_select
(a,0,14
,5))
;return0;
}
把a陣列賦值,並且傳遞四個引數;
int
quick_select
(int a,
int l,
int r,
int k)
int i = l, j = r;
由傳遞的四個引數我們可以知道:
l=0,r=14,k=5;
int p =
rand()
%(r - l +1)
+ l;
//隨機產生乙個0~(r-l+1)的數,加上l後賦值給p;
int x = a[p]
;//x賦值為a[p],也就是快排裡面的基準-「主元」;
//把主元和最後乙個元素交換位置;
int i = l, j = r;
i=0,j=14;
while
(i < j)
while
(i < j && a[j]
> x) j--;if
(i < j)
}//標準的快速排序,小於主元的放前邊,大於主元的放後面;
a[i]
= x;
//把主元放到排序中的位置去;
p = i;
if(i - l +
1== k)
return a[i];if
(i - l +
1< k)
return
quick_select
( __________________ )
;//填空
else
return
quick_select
(a, l, i -
1, k)
;}
把i的位置用p記錄下來,i-l-1就是i在這個陣列中是第幾位小的;
if
(i - l +
1== k)
return a[i]
;//假如第i-l+1位剛好和k相等,返回a[i];
if(i - l +
1< k)
return
quick_select
( __________________ )
;//填空
//假如比k小,就應該在大的那邊找;
else
return
quick_select
(a, l, i -
1, k)
;//假如比k大,就在小的那邊找;
大的那邊在右邊,所以起始位置就應該:
l=i+1;而這樣傳過去,就相當於判斷陣列的左端點發生了改變,所以k在這裡應該也要有相應的變化,即k=k-i+l-1;
所以填空的正確答案是
if
(i - l +
1< k)
return
quick_select
( a,i+
1,r,
(k-i+l-1)
);//填空
#include
#include
intquick_select
(int a,
int l,
int r,
int k)
int i = l, j = r;
while
(i < j)
while
(i < j && a[j]
> x) j--;if
(i < j)
} a[i]
= x;
p = i;
if(i - l +
1== k)
return a[i];if
(i - l +
1< k)
return
quick_select
( a,i+
1,r,
(k-i+l-1)
);//填空
else
return
quick_select
(a, l, i -
1, k);}
intmain()
;printf
("%d\n"
,quick_select
(a,0,14
,5))
;return0;
}
第九屆藍橋杯初賽C B組第五題 快速排序
以下 可以從陣列a中找出第k小的元素。它使用了類似快速排序中的分治演算法,期望時間複雜度是o n 的。請仔細閱讀分析原始碼,填寫劃線部分缺失的內容。答案 a,i 1,r,k i l 1 include int quick select int a,int l,int r,int k int i l,...
第九屆藍橋杯省賽 第五題 快速排序
以下 可以從陣列a中找出第k小的元素。它使用了類似快速排序中的分治演算法,期望時間複雜度是o n 的。請仔細閱讀分析原始碼,填寫劃線部分缺失的內容。注意 只填寫劃線部分缺少的 不要抄寫已經存在的 或符號。include includeint quick select int a,int l,int ...
2018第九屆藍橋杯B組決賽題解第五題 搭積木
此處可以交題 思路 本題應該是dp題,當時到最後乙個小時才慢慢想清本題到底考什麼模型.我們清楚每一層都有乙個可行的最大高度,他說每一層必須連續也就是說我們取的l到r區間的高度不能有高度先下降後上公升的情況,也就是我們可以列舉每乙個合法不含x的l,r區間,然後對於區間內的第i個柱子,高度從1開始列舉,...