冒泡排序
冒泡排序(英語(yǔ):Bubble Sort)是一種簡(jiǎn)單的排序算法。它重復(fù)地遍歷要排序的數(shù)列,一次比較兩個(gè)元素,如果他們的順序錯(cuò)誤就把他們交換過(guò)來(lái)。遍歷數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說(shuō)該數(shù)列已經(jīng)排序完成。這個(gè)算法的名字由來(lái)是因?yàn)樵叫〉脑貢?huì)經(jīng)由交換慢慢“浮”到數(shù)列的頂端。
冒泡排序算法的運(yùn)作如下:
- 比較相鄰的元素。如果第一個(gè)比第二個(gè)大(升序),就交換他們兩個(gè)。
- 對(duì)每一對(duì)相鄰元素作同樣的工作,從開(kāi)始第一對(duì)到結(jié)尾的最后一對(duì)。這步做完后,最后的元素會(huì)是最大的數(shù)。
- 針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)。
- 持續(xù)每次對(duì)越來(lái)越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較。
冒泡排序的分析
交換過(guò)程圖示(第一次):

圖片.png
時(shí)間復(fù)雜度
- 最優(yōu)時(shí)間復(fù)雜度:O(n) (表示遍歷一次發(fā)現(xiàn)沒(méi)有任何可以交換的元素,排序結(jié)束。)
- 最壞時(shí)間復(fù)雜度:O(n2)
- 穩(wěn)定性:穩(wěn)定
冒泡排序的演示
效果:

image
代碼:
def bubble_sort(alist):
for i in range(len(alist)-1):
count = 0
for j in range(len(alist)-1-i):
if alist[j] > alist[j+1]:
alist[j],alist[j+1] = alist[j+1],alist[j]
count += 1
if count == 0:
return
選擇排序
選擇排序(Selection sort)是一種簡(jiǎn)單直觀的排序算法。它的工作原理如下。首先在未排序序列中找到最?。ù螅┰?,存放到排序序列的起始位置,然后,再?gòu)氖S辔磁判蛟刂欣^續(xù)尋找最?。ù螅┰?,然后放到已排序序列的末尾。以此類(lèi)推,直到所有元素均排序完畢。
選擇排序的主要優(yōu)點(diǎn)與數(shù)據(jù)移動(dòng)有關(guān)。如果某個(gè)元素位于正確的最終位置上,則它不會(huì)被移動(dòng)。選擇排序每次交換一對(duì)元素,它們當(dāng)中至少有一個(gè)將被移到其最終位置上,因此對(duì)n個(gè)元素的表進(jìn)行排序總共進(jìn)行至多n-1次交換。在所有的完全依靠交換去移動(dòng)元素的排序方法中,選擇排序?qū)儆诜浅:玫囊环N。
選擇排序分析
排序過(guò)程:

圖片.png

圖片.png
紅色表示當(dāng)前最小值,黃色表示已排序序列,藍(lán)色表示當(dāng)前位置。
時(shí)間復(fù)雜度
- 最優(yōu)時(shí)間復(fù)雜度:O(n2)
- 最壞時(shí)間復(fù)雜度:O(n2)
- 穩(wěn)定性:不穩(wěn)定(考慮升序每次選擇最大的情況)
選擇排序演示

圖片.png
代碼:
def selection_sort(alist):
for i in range(len(alist)-1):
min_index = i
for j in range(i+1,len(alist)):
if alist[min_index] > alist[j]:
min_index = j
alist[i],alist[min_index] = alist[min_index],alist[i]
冒泡和快速排序的對(duì)比:
| 冒泡 | 快速 | |
|---|---|---|
| 最優(yōu)時(shí)間復(fù)雜度: | O(n) | O(n2) |
| 最壞時(shí)間復(fù)雜度: | O(n2) | O(n2) |
| 穩(wěn)定性: | 穩(wěn)定 | 不穩(wěn)定 |