Python之排序演算法:快速排序與氣泡排序

funnyZpC發表於2017-11-19

Python之排序演算法:快速排序與氣泡排序

轉載請註明源地址:http://www.cnblogs.com/funnyzpc/p/7828610.html

  入坑(簡稱IT)這一行也有些年頭了,但自老師講課提過排序演算法後幾乎再也沒寫過排序演算法,當然這也沒有什麼問題,實際的排序大多是將資料從資料庫取出來前在資料庫中就已經做好排序了,當然這個排序是SQL範疇的,如果真的需要在程式碼中排序也有對應的工具類來處理,就比如有Java中有Array.sort()來排列Array(陣列型別),功能雖說有限制,但也免去了擼碼的時間,嗯,不用寫的大好處就是減少了開發時間,當然也增加了喝咖啡、網購的時間~

 

 

閒言多廢話,先展示下快速排序的動態圖再出程式碼,方便理解:

(上圖是從維基百科中抓取的,包括本節所講所的氣泡排序也是維基百科的)

  嗯,酷酷的時間到了,先我大概講下快速排序

    A>先取一個數(一般是第一個數)作為參照的基準值

    B>將待排序的陣列分兩邊,一左一右分別指向陣列的兩邊

    C>左右兩邊分別向中間移,所指的數值大於基準值的向基準值右邊放(如果是右邊所指的值就挪動指向的位置,值不動),左邊也一樣

    D>將基準位置兩邊的值分別排序(一般是遞迴呼叫)

好了,以上大概就是快速排序的的一半步驟,如有不懂之處,建議順著程式碼來推測快速排序的整個過程,並不難

 1 #!/usr/bin/env Python
 2 #快速排序法
 3 def quickSort(arr,_l,_r):
 4     l,r,t=_l,_r,0
 5     if l <= r:
 6         t=arr[_l]   #基準引數
 7         while(l<r):
 8             #當右邊的值大於基準引數時,右值向左挪一(位置和值)
 9             while l<r and arr[r]>=t:
10                 r=r-1
11             arr[l]=arr[r]   #右值挪到左值的位置
12             # 當左邊的值小於基準引數時,右值向左挪一(位置和值)
13             while l<r and arr[l]<=t:
14                 l=l+1
15             arr[r]=arr[l]   #左值放入右值的位置
16         '''
17             當前一輪排完後將基準引數放入
18             將基準值左右兩邊的數值分別放入排序(遞迴呼叫)
19         '''
20         arr[r]=t #基準引數歸位
21 
22         quickSort(arr,_l,l-1) #基準位置左側資料排序
23         quickSort(arr,l+1,_r) #基準位置右側資料排序
24 
25 i=[23,1,6,77,8,-11,100,11.1,99,24,21]
26 print ("排序之前")
27 print (i)
28 print ("排序之後")
29 quickSort(i,0,len(i)-1)
30 print (i)
31 
32 ==========以下是控制檯輸出===========
33 
34 排序之前
35 [23, 1, 6, 77, 8, -11, 100, 11.1, 99, 24, 21]
36 排序之後
37 [-11, 1, 6, 8, 11.1, 21, 23, 24, 77, 99, 100]

 

嗯~,快速排序完畢,先展示下氣泡排序的動態圖,密集恐懼症者勿入

 

結合著圖,氣泡排序的過程大致是這樣子的:

  A>取待排序陣列中的一個值(一般是第一個值)作為基準值依次與其它所有數值比較

  B>大於基準值的直接略過,小於基準值的與基準值交換位置

額~,還是用程式碼說話還是比較好一些吧~

 1 #!/usr/bin/env Python
 2 
 3 #氣泡排序法
 4 def bubleSort(arr):
 5     for k in range(len(arr)):
 6         temp = arr[k]   #臨時值,用於交換
 7         for j in range(k+1,len(arr)):
 8             '''
 9                 若值比基準值小則將基準值與當前值交換位置
10             '''
11             if arr[j]<arr[k]:
12                 temp=arr[k]
13                 arr[k]=arr[j]
14                 arr[j]=temp
15                 continue;   #這裡可有可無
16 
17 i=[23,1,6,77,8,-11,100,11.1,99,24,21]
18 
19 print ("排序前")
20 print (i)
21 print ("排序後")
22 bubleSort(i)
23 print (i)
24 
25 ==========控制檯輸出============
26 排序前
27 [23, 1, 6, 77, 8, -11, 100, 11.1, 99, 24, 21]
28 排序後
29 [-11, 1, 6, 8, 11.1, 21, 23, 24, 77, 99, 100]

 

既然是Python,當然Python中對於陣列也內建了一鍵排序演算法:

1 ii=[23,1,6,77,8,-11,100,11.1,99,24,21]
2 ii.sort()    #陣列內建sort方法排序
3 print ("ii",ii)
4 ij=[23,1,6,77,8,-11,100,11.1,99,24,21]
5 ij=sorted(ij) #外部方法排序(相當於工具類)
6 print ("ij",ij)

既然Python已經提供了排序方法,還要白忙活一氣,是不是很悲傷?

以上排序程式碼真實可信,均為本猿一行行碼出,寫得十分痛苦,同時如有遺漏及錯誤之處敬請提出~

 

That's All,現在是 2017-11-19 16:03:22 (週五),小學生都忙著趕作業,我也該撤了

下一節是 “Django” 框架搭建,如興趣的記得點關注?

 

相關文章