MOOC資料結構與演算法Python版第七周作業

2021-10-10 01:33:45 字數 1416 閱讀 8335

第七周作業(北**課同學選做)

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...