參考教材用python複習了一下排序演算法。在開頭總結一下整體排序演算法給我感覺是:元素之間怎麼進行對比,各類排序演算法都是在此操作上不斷改進,直到時間複雜度快速排序目前已經達到了o(nlogn)最內層核心思想是相鄰元素的交換比較:
if alist[i]
>alist[i+1]
: alist[i]
, alist[i+1]
=alist[i+1]
, alist[i]
然後思考怎麼控制這個比較過程呢,可以先以第一次為例,i從零號開始,走到n-2號時進入比較條件,n-2和n-1號元素進行比較完成最後一次交換。所以迴圈暫且先寫成:
for i in
range(0
,n-1
)
這裡注意python是最右邊取不到。
外層迴圈:每走一次就會把最大元素放到最後,所以遍歷n-2次就排好了n-1個元素,最後乙個元素不用排序自然位置固定。
外部迴圈:
for j in
range(0
,n-1
):
現在思考i在走內層迴圈的時候最後終止於應當是順序表長度減去已經排好的長度所以更改內層迴圈如下:
for i in
range(0
,n-1
-j):
想到現在基本的氣泡排序已經完成了:
def
bubble_sort
(alist)
: n=
len(alist)
for j in
range(0
,n-1):
# count=0
for i in
range(0
,n-1
-j):
if alist[i]
>alist[i+1]
: alist[i]
, alist[i+1]
=alist[i+1]
, alist[i]
但想一下時間複雜度思考當已經是有序序列的時候兩層迴圈還是要都走一遍,所以可以進一步優化一下:在內層迴圈開始之前加上count變數,如果每第一次進行內層迴圈時候如果沒有交換就判斷有序,退出函式即可。
**如下:
def
bubble_sort
(alist)
: n=
len(alist)
for j in
range(0
,n-1):
count=
0for i in
range(0
,n-1
-j):
if alist[i]
>alist[i+1]
: alist[i]
, alist[i+1]
=alist[i+1]
, alist[i]
count+=
1if count==0:
return
#最優情況的優化
時間複雜度為o(n^2)
兩個演算法思想很好相比較記憶,兩個演算法都對順序表進行思想上的劃分,一部分有序,一部分無序。選擇排序是在無序的部份進行比較放到已經固定好的有序序列中,主要比較操作在無序部份。而插入排序是無序的元素在有序列表中進行比較,找到自己在有序序列中的位置。主要操作在有序部份。下面說選擇排序。
假設第一次排序,主要操作是尋找通過比較尋找無序列表中最小元素的下標位置:
for i in
range(1
,n):
if alist[
min]
>alist[i]
:min
= i
外層走多少遍呢,外層每執行一次就排好了乙個元素,所以外層還是
for j in
range(0
,n-1
):
這時候再修改內層的i範圍,應該是(j+1, n),因為假設公升序排列,前面是已經排好的序列了。
這時候完成**:
def
selection_sort
(alist)
: n=
len(alist)
for j in
range(0
,n-1):
min=j
for i in
range
(j+1
,n):
if alist[i]
min]
:min
=i alist[j]
,alist[
min]
=alist[
min]
,alist[j]
注意內層執行完一次要進行元素交換
時間複雜度o(n^2)
下面是插入演算法:
按公升序從小到大排列。順序表的劃分是:有序|無序,無序序列最左邊的元素與有序序列最右邊的元素開始從從右向左的比較,知道遇到自己的合適位置停止。
**如下:
while i>0:
if alist[i]
: alist[i]
, alist[i-1]
= alist[i-1]
,alist[i]
i-=1else
:break
外層控制要插入元素的下標,整體函式**如下:
def
insert_sort
(alist)
: n=
len(alist)
for j in
range(1
,n):
i=jwhile i>0:
if alist[i]
: alist[i]
, alist[i-1]
= alist[i-1]
,alist[i]
i-=1else
:break
Python筆記 排序演算法實現(1)
排序是資料結構中常用的方法,現用python實現起泡排序和選擇排序。將被排序的記錄陣列r 1.n 垂直排列,每個記錄r i 看作是重量為r i key的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃瞄陣列r 凡掃瞄到違反本原則的輕氣泡,就使其向上 飄浮 如此反覆進行,直到最後任何兩個氣泡都是輕者...
排序演算法python實現
先列出一些演算法複雜度的識別符號號的意思,最常用的是o,表示演算法的上屆,如 2n2 o n2 而且有可能是漸進緊確的,意思是g n 乘上乙個常數係數是可以等於f n 的,就是所謂的a b。而o的區別就是非漸進緊確的,如2n o n2 o n2 確實可以作為2n的上屆,不過比較大,就是所謂的a其他符...
python排序演算法實現
coding utf 8 氣泡排序 氣泡排序演算法的運作如下 比較相鄰的元素。如果第乙個比第二個大 公升序 就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步...