對於乙個長度為n的列表來說,需要進行n-1趟的比較,第一趟需要比較n-1次,把最大的數排到列表的末端。第二趟需要比較n-2次,把第二大的數放到列表的倒數第二個位置。以此類推。
def
bubblesort
(tarlist)
:for passnum in
range
(len
(tarlist)-1
,0,-
1):for i in
range
(passnum)
:if tarlist[i]
>tarlist[i+1]
: tarlist[i]
,tarlist[i+1]
=tarlist[i+1]
,tarlist[i]
#這是python中特有的互換值的方法。
這種方法比較的次數是n的平方級別的。
氣泡排序是比較差的方法,主要是要經過多次無效的對比和交換,它的好處就是不需要額外的儲存空間的開銷。
效能改進:我們可以對每趟進行監測,如果某趟對比中沒有發生任何交換,說明列表中已經不再存在逆序,排序也就可以提前結束了。
def
bubblesort
(tarlist)
: passnum=
len(tarlist)-1
exchange=
true
while passnum>
0and exchange:
exchange=
false
for i in
range
(passnum)
:if tarlist[i]
>tarlist[i+1]
: tarlist[i]
, tarlist[i +1]
= tarlist[i +1]
, tarlist[i]
exchange=
true
passnum-=
1
交換排序:選擇排序對氣泡排序進行的改進,保留了多趟對比的思路,每項都使當前最大項就位,但是選擇排序對交換進行了削減,,每趟僅進行一次交換,記錄最大項的所在位置,再跟本趟最大項進行交換。特別注意的是,每次比較一定要拿第乙個往後比較,下面的兩個程式,第乙個maxpos放在了迴圈之前,這就不可以,可能會拿前面n-1個數和第n個最大數比較大小,導致最大值得位置從來不更新``
def
selectsort
(alist)
: num=
len(alist)-1
maxpos=
0for passnum in
range
(num,0,
-1):
for i in
range(1
,passnum+1)
:if alist[i]
> alist[maxpos]
: maxpos=i
alist[passnum]
,alist[maxpos]
=alist[maxpos]
,alist[passnum]
def
selectsort
(alist)
: num=
len(alist)-1
for passnum in
range
(num,0,
-1):
maxpos=
0#每次迴圈都拿0和後面的數進行比較
for i in
range(1
,passnum+1)
:if alist[i]
> alist[maxpos]
: maxpos=i
alist[passnum]
,alist[maxpos]
=alist[maxpos]
,alist[passnum]
排序 氣泡排序與選擇排序
最近複習大學學過的演算法,這裡做個筆記。排序,我們學過 這裡需要了解什麼是時間複雜度,什麼是空間複雜度。簡單而言,時間複雜度指執行的次數,空間複雜度指消耗的記憶體。它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果順序 如從大到小 首字母從z到a 錯誤就把他們交換過來。走訪元素的工作是重複地...
選擇排序與氣泡排序
今早心血來潮,又想看看氣泡排序.於是乎度娘一番,找到了度娘給我的這篇文章,前面的文字描述還是簡單易懂的,可惜給出的 示範有些文不對題.於是乎又wiki一番.發現上文給出的 形似選擇排序,於是總結如下 我們假設有乙個陣列 624159 對應的索引也就是 0 5,如果我想描述第二個位置,也就是數字2的位...
選擇排序與氣泡排序
選擇排序 static void sort1 int arr var temp arr i arr i arr min arr min temp 氣泡排序 static void sort2 int arr static void main string args sort1 arr foreach...