python演算法(二) 選擇排序

2021-10-08 09:33:34 字數 2444 閱讀 9493

假設你和你的朋友去看一場精彩的p站推薦電影,那麼你就只是給工作人員說,我買兩張票,然後根據票上的位址提示你們倆找到了座位去看精彩的電影。這就是計算機的工作原理,計算機就像乙個很大的電影院,每個座位都有相應的位址。

需要處理多個資料的時候,我們有兩種基本的方式,陣列和鍊錶。

陣列意味著所有元素都是鄰居關係,物理空間緊密相連;

鍊錶則意味著各元素之間通過位址相連線,物理空間並不連續。就像你在玩乙個尋寶遊戲,你到達第一處地方的時候,完成了第乙個任務,接著你發現乙個紙條,這個紙條告訴你下乙個地方是什麼,鍊錶就是這麼執行的,元素裡存在乙個位址告訴計算機下乙個元素儲存在**。

每乙個概念的出現都是為了解決乙個特定的問題,在學習之前,我們先考慮乙個問題,不用鍊錶行不行?

行,但是很麻煩。舉個例子,你和乙個朋友去看電影,你們自然而然地把座位選擇在了一起,不一會兒,你又來了乙個朋友,而你開始的兩個座位旁邊已經被其他人占用了,如果你們還是要坐在一起(對於陣列來說,這是必須的),那你們只有再找乙個地方,這個地方有連續的三個空位置,好了,假設位置找到了,悲催的事情發生了,你女朋友也要來看電影,於是,你又要死乞白賴地去找乙個有連續四個空座位的地方,此刻,你心裡緊張兮兮,可不要再來人了。

或者還有另外的一種解決方案,你直接事先買了十張電影票,座位都是連續的,這種方法十分土豪,對於記憶體來說,如果你最後只來了兩個人,那麼其餘的八個記憶體空間就被浪費了,如果最後來了十乙個人,那麼記憶體位置又要重新申請,怎麼解決呢?鍊錶。

鍊錶不怕人多,還是回到剛剛的電影院案例,你們幾個想要坐在一起其實就是為了感知對方的存在,那這樣,現在每個人手上都有一條紅線,這條線可以連線你和你的朋友,讓你感知到你朋友的心跳,只要你們都左手拿著連線給別人的線,右手拿著別人傳遞給你的線,那麼你們的感情就依然親密,這時候來了乙個人,沒事,讓她隨便坐,然後給她一條紅線,讓別人接過這條紅線就可以了,你們還是乙個整體。

由此可知,鍊錶實現插入操作很絲滑、流暢。

既然鍊錶這麼好,可以隨便插入,那麼都用鍊錶不就可以了嗎?為什麼還要用陣列呢,這個問題問得非常好。

鍊錶插入很快,但是!!!找人很難,回到上面的例子,上面來了個女孩子,被別人用紅線牽著,現在她男朋友過來電影院要把她領走,帶她去優衣庫試衣服。怎麼找呢?在鍊錶中只能這樣找:順著第乙個人的紅線一直找過去,就像乙個鐵鍊子一樣,你不知道你女朋友在哪一環,所以只能挨個找。這就像乙個網頁給你推薦了十大p站經典電影排行榜,首先的頁面是第十個,然後你只能一直按「next"十下才能找到第一的那個經典文藝電影?氣不氣?實際上,不是開玩笑,這樣的網頁結構確實是用鍊錶結構來實現的。

回到我們的問題,用鍊錶雖然插入快(找到乙個空閒的座位容易)但是讀取難(被男朋友找到比較困難)

陣列剛好是反過來的,陣列讀取很簡單,每個元素都有乙個編號,找人的時候我只需要找到對應的編號就可以了。(不過問題在於,你需要知道你女朋友座位的編號,如果不知道編號,領的可能是你女朋友的男同學,對於這樣的乙個問題,後面還有更好的解決方式,就是字典,也叫雜湊表,對於雜湊表來說,你只需要知道你的女朋友叫牛翠花就行了,然後到電影院大喊一聲:「牛翠花何在?速與我去優衣庫試衣服」,然後牛翠花就從座位**來了,你根本不需要知道你女朋友坐在**,何況每次座位都不同,記著編號總沒有記著名字容易)

現在我們有乙個豆瓣根據我們的喜好推薦的電影列表,我們要對他們進行乙個從高到低的排行。怎麼做呢?

電影名稱

滿城盡帶**甲

125頭文字d

146東風破

5555

大理寺日誌

123456789

美麗人生

5631、首先在這一列中找到最大的,放到乙個新列表中,並把這個元素從老的列表中移除

電影名稱

大理寺日誌

123456789

2、重複上一步驟,找到移除後列表中最大的,新增到新列表的第二項

電影名稱

大理寺日誌

123456789

東風破5555

在程式設計中實現其實就是兩個步驟,首先要寫乙個尋求最小值的函式,其次是乙個新增到新列表中的函式。**如下:

def

findsmallest

(arr)

: smallest=arr[0]

smallest_index=

0for i in

range(1

,len

(arr)):

if arr[i]

smallest=arr[i]

smallest_index=i

return smallest_index

defselcetionsort

(arr)

: newer=

for i in

range

(len

(arr)):

smallest =findsmallest(arr)

)return newer

print

(selcetionsort[5,

3,6,

8,12,

65,9]

)

排序演算法 二 選擇排序

之前給大家分享了排序演算法裡面比較簡單的氣泡排序,今天來分享一下選擇排序的演算法 選擇排序的思想 1.以公升序為例 在一組數中選出最大的數放到第乙個位置,或者選出最小的數放到最後乙個位置,2.在選取剩餘元素的最大數放到第二個位置,或選出剩餘元素中的最小值放到倒數第二哥位置,3.依次往下選取,直到遍歷...

排序演算法 二 選擇排序

演算法實現 selectsort.c include void selectsort int arr,int len if min i for k 0 k演算法思想 保證將要成為有序範圍內的那個位置的值是無序裡的最小值。ex 從陣列選出最小的放在第乙個位置上,在從剩餘陣列選出最小放在第二個位置上,以...

排序演算法(二) 選擇排序

選擇排序是一種簡單的直觀的排序演算法,基本原理如下 對於給定的一組記錄,經過一輪比較後得到最小的記錄,然後將該記錄的位置與第乙個記錄的位置交換 接著對不包括第乙個記錄以外的其他記錄進行第二次比較,得到最小記錄並與第二個位置記錄交換,重複該過程,直到進行比較的記錄只剩下乙個為止 從簡單排序的過程來看,...