算法筆記(五):快速排序和簡單選擇排序


(一)  快速排序

按照快速排序的思想,對數組A[p…r]進行排序。

    1、 選擇一個基准A[q],調整數組,確保滿足下面2個條件。

        a)   A[p…q-1] 的數據都小於等於 A[q]

        b)   A[q+1…r] 的數據都大於A[q]

    2、 對A[p…q-1] 和 A[q+1…r]重復1步驟

 

例如:對列表[12,7,9,8,10,16,17,15]進行排序

    1、 選擇基准A[q] = 12,小於等於12的都插入到12前面,最后[7,9,8,10,12,16,17,15] ,返回基准A[q]的索引=4

    2、  分別對A[p…q-1](即[7,9,8,10])和A[q+1…r](即[16,17,15])重復1過程。

實現:

 

 1 #快速排序
 2 def quickSort(A,p,r):
 3     #當p等於r的時候,代表只有一個元素,這個時候就沒必要調用partition(A,p,r)了
 4     if p != r:
 5         q = partition(A,p,r)
 6         #遞歸
 7         quickSort(A,p,q)
 8         quickSort(A,q+1,r)
 9     return A
10 #調整列表
11 def partition(A,p,r):
12     x = A[p] #選擇A[p]作為基准
13     #迭代列表其他元素(A[p]之外的元素)
14     for i in range(p+1,r):
15         #小於基准的數據,都插入到A[p]前面
16         if A[i] <= x:
17             # 20200510更新
18             # A.insert(p,A.pop(i))
19             A[p],A[i] = A[i],A[p]
20             A[p+1],A[i] = A[i],A[p+1]
21             p += 1 #獲取基准元素最新的索引
22     #返回基准元素的索引
23     return p
24 
25 A = [12,5,7,8,10,15,88,77,55,66,12,88,99,66,999,12]
26 
27 print(quickSort(A,0,len(A)))

 

 

 

(二)  簡單選擇排序

簡單選擇排序的思路是,假設列表有N個元素,對前N-1個元素執行下面的過程

1、從第一個元素開始查找,找出列表中的最小元素和A[0]交換

2、從第二個元素開始查找,找出列表中的最小元素和A[1]交換

3、從第三個元素開始查找,找出列表中的最小元素和A[2]交換

......

實現:

 1 def selectSort(A):
 2     #迭代列表的前n-1個元素
 3     for i in range(len(A)-1):
 4         k = i
 5         for j in range(i+1,len(A)):
 6             if A[k] > A[j]:
 7                 k = j  #更新最小值的索引
 8         #如果A[i]不是最小值,交換A[i],A[k]的值
 9         if k != i:
10             A[k],A[i] = A[i],A[k]
11 
12     return A
13 
14 
15 A = [12,5,7,8,10,15,88,77,55,66,12,88,99,66,999,12]
16 
17 print(selectSort(A))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM