第九屆藍橋杯B組第五題 快速排序(C語言)

2021-10-02 14:42:14 字數 3174 閱讀 8555

以下**可以從陣列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開始列舉,...