第七周作業(北**課同學選做)
1.快速排序主元(10分)
題目內容:著名的快速排序演算法裡有乙個經典的劃分過程:我們通常採用某種方法取乙個元素作為主元(中值),通過交換,把比主元小的元素放到它的左邊,比主元大的元素放到它的右邊。 給定劃分後的n個互不相同的正整數的排列,請問有多少個元素可能是劃分前選取的主元?
例如給定的排列是[1, 3, 2, 4, 5]。則:1 的左邊沒有元素,右邊的元素都比它大,所以它可能是主元;儘管 3 的左邊元素都比它小,但其右邊的 2 比它小,所以它不能是主元;儘管 2 的右邊元素都比它大,但其左邊的 3 比它大,所以它不能是主元;類似原因,4 和 5 都可能是主元。因此,有 3 個元素可能是主元。
輸入格式:
一行數個整數的排列,由空格分隔
輸出格式:
在第 1 行中輸出有可能是主元的元素個數;在第 2 行中按遞增順序輸出這些元素,其間以 1 個空格分隔,行首尾不得有多餘空格。
輸入樣例:1 3 2 4 5
輸出樣例:
31 4 5
時間限制:500ms 記憶體限制:32000kb
本頭腦簡單想出的頭腦簡單思路,極有可能時間或記憶體超出限制(記錄完這篇就去看看大佬的思路)。判斷乙個數是否主元,如果這個數左邊的數都比他小,並且右邊的數都比他大,他就是主元。即:
使用if的or語句判斷條件時,把判斷列表是否為空寫在or前面。如果列表空,就不再判斷or後面的條件。因為max()執行的物件是空列表,就會報錯。
def
judge_mid
(blist)
:#將輸入的字串轉換成數字列表
alist =
for i in blist.split():
int(i)
) mid_list =
#比較左右數值判斷主元,mid_list列表記錄主元
for position in
range
(len
(alist)):
if alist[
:position]==[
]ormax(alist[
:position]
)<=alist[position]
:if alist[position+1:
]==ormin
(alist[position+1:
])>=alist[position]:)
print
(len
(mid_list)
)#公升序排序、將列表轉換數字字串輸出
mid_list.sort(
)for i in mid_list:
print
(i, end=
' ')
blist =
input()
judge_mid(blist)
歡迎指正 MOOC資料結構與演算法Python版 第六周測驗
1 單選 2分 下列哪個演算法使用到了分治策略?d 2單選 2分 函式值快取最適合使用哪種python中的資料型別?b 3 單選 2分 已知數列g x 滿足 根據遞推式寫出求數列值的遞迴演算法,問原始演算法與採用函式值快取的演算法時間複雜度分別為多少?a 4 單選 2分 博物館大盜問題中,若共有10...
mooc資料結構筆記(題來自mooc)
6 2 順序表操作集 20 分 本題要求實現順序表的操作集。list makeempty position find list l,elementtype x bool insert list l,elementtype x,position p bool delete list l,positio...
《資料結構與演算法》 浙大MOOC)第1章 概論
include include include clock t start,stop double duration define maxn 10 多項式最大項數,即多項式階數 1 define maxk 1e7 被測函式最大重複呼叫次數 doublef1 int n,double a,double...