選擇排序
選擇排序(Selection sort)是一種簡單直觀的排序算法誉券。它的工作原理如下:
首先在未排序序列中找到最泄鹑(大)元素,存放到排序序列的起始位置凉逛,然后性宏,再從剩余未排序元素中繼續(xù)尋找最小(大)元素状飞,然后放到已排序序列的末尾毫胜。以此類推,直到所有元素均排序完畢诬辈。
選擇排序的主要優(yōu)點與數(shù)據(jù)移動有關(guān)酵使。如果某個元素位于正確的最終位置上,則它不會被移動焙糟。選擇排序每次交換一對元素口渔,它們當(dāng)中至少有一個將被移到其最終位置上,因此對n個元素的表進(jìn)行排序總共進(jìn)行至多n-1次交換穿撮。在所有的完全依靠交換去移動元素的排序方法中缺脉,選擇排序?qū)儆诜浅:玫囊环N。
選擇排序分析
排序過程:
我們把比較得到的最小的數(shù)字放在隊首悦穿,首先把游標(biāo)放在下標(biāo)為0的元素這攻礼,然后依次與后面的其他數(shù)字作比較,比較到下標(biāo)為3的時候栗柒,發(fā)現(xiàn)17比54大礁扮,那么最小值的下標(biāo)0余3進(jìn)行交換,但此時比較不會停止而是拿著下標(biāo)的3的數(shù)字接著同剩下的數(shù)字進(jìn)行比較瞬沦,最后確定下標(biāo)為3的是最小的太伊,然后下標(biāo)0和下標(biāo)3的元素互換,同理逛钻,其他的也是如此僚焦。
代碼實現(xiàn):
def select_sort(li):
n = len(li)
for j in range(0,n-1):
min_index = j
for i in range(j*+1,n):
if li[i]<li[min_index]:
min_index = i
li[j],li[min_index] = li[min_index],li[j]
if __name__ == '__main__':
ali = [12,23,11,33,4,55,12,44,52,21]
print(ali)
select_sort(ali)
print(ali)
時間復(fù)雜度
最優(yōu)時間復(fù)雜度:O(n^2)
最壞時間復(fù)雜度:O(n^2)
穩(wěn)定性:不穩(wěn)定(考慮升序每次選擇最大的情況)
穩(wěn)定性的問題主要是升序問題:
第一個(26,2)是不是要依次和后面的數(shù)據(jù)比較,一直比較到(26,1)發(fā)現(xiàn)倆一樣大绣的,但程序還是選擇(26叠赐,2)大欲账,然后接著同后面的數(shù)據(jù)比較,把(26芭概,2)放到隊尾了赛不,然后接著遍歷,最后會把(26,1)放到次尾部罢洲,故不穩(wěn)定踢故。