二、快速排序
學習各種排序演算法,後續會繼續補充。
例:對資料從小到大進行排序
先在列表中檢查每個元素找到最小的;需要的時間o(n)
執行n次這樣的操作;需要的總時間o(n∗n
n*nn∗
n),即o(n
2n^2
n2)
def findsmallest
(arr)
: smallest = arr[0]
smallest_index =
0for i in range(1
,len
(arr)):
if arr[i]
< smallest:
smallest = arr[i]
smallest_index = i
return smallest_index
找最小值函式,返回其下標
def selectionsort
(arr)
: newarr =
for i in range
(len
(arr)):
smallest =
findsmallest
(arr)
newarr.
(arr.
pop(smallest)
)return newarr
print selectionsort([
4,7,
9,3,
2])
採用分而治之(divide and conquer, d&c)的策略
設待排序序列為a[start,end],在序列中找到乙個基準值(基準值後續會提到)a[p];
對序列進行分割槽(partitioning):將序列中小於等於a[p]的元素放在a[p]左面,大於a[p]的元素放在a[p]右面;
對左右兩個分割槽遞迴呼叫快速排序演算法;
本演算法中a[p]取待排序陣列中的第乙個元素
def quicksort
(array):if
len(array)
<2:
return array
else
: pivot = array[0]
less =
[i for in array[1:
]if i <= pivot]
greater =
[i for in array[1:
]if i > pivot]
return
quicksort
(less)
+[pivot]
+quicksort
(greater)
print quicksort([
5,7,
3,9]
)
每次都取第乙個元素作為基準值:
對於陣列 [1,2,3,4,5,6,7,8]
第一次快排:1 [2,3,4,5,6,7,8] (1只有乙個元素已是有序)
第二次快排:2 [3,4,5,6,7,8]
第三次快排:3 [4,5,6,7,8]
第四次快排:4 [5,6,7,8]
第五次快排:5 [6,7,8]
第六次快排:6 [7,8]
第七次快排:7 [8]
呼叫棧的高度:8
棧長:o(n)
在每一層進行比較的時間為o(n)
則最糟情況下的時間複雜度:o(n
2n^2
n2) (和選擇排序一樣)
每次都取中間元素作為基準值:
對於陣列 [1,2,3,4,5,6,7,8]
第一次快排:[1,2,3] 4 [5,6,7,8]
第二次快排:[1] 2 [3]
[5] 6 [7,8]
第三次快排:7 [8]
呼叫棧的高度:4
棧長:o(logn)
在每一層進行比較的時間為o(n)
則最佳情況下的時間複雜度:o(nlogn)
經證明:在隨機選擇乙個陣列元素作為基準值,最佳情況也是平均情況 (演算法導論上有證明,略複雜)
本演算法中a[p]的選擇是隨機的
快排:
void
randomizedquicksort
(type a,
int start,
int end)
}
獲取隨機基準值,與陣列第乙個元素進行交換
int
randomizedpartition
(type a,
int start,
int end)
排序後返回基準值下標
int
partition
(type a,
int start,
int end)
a[start]
=a[j]
; a[j]
=x;return j;
//返回執行一次排序後的基準值的下標
}
void
swap
(type &x,type &y)
快速排序,選擇排序
選擇排序 123 4567 891011 1213 1415 1617 1819 2021 2223 int selectionsort int argv int size 選擇排序 if minindex i return time 來自code的 片 selectionsort.cpp 快速排序...
氣泡排序,選擇排序,快速排序
1.氣泡排序 氣泡排序 bubble sort 最為簡單的一種排序,通過重複走完陣列的所有元素,通過打擂台的方式兩個兩個比較,直到沒有數可以交換的時候結束這個數,再到下個數,直到整個陣列排好順序。因乙個個浮出所以叫氣泡排序。雙重迴圈時間o n 2 void bubblesort int arr in...
氣泡排序 選擇排序 快速排序
氣泡排序的思想在於,不斷地將當前元素與後乙個元素進行比較,如果當前元素較小,則調換當前元素與後乙個元素的位置,否則保持不變 假設需要排序的元素一共有n個,從第乙個元素開始,對後續的 n 2 元素進行上述比較,最終的排序結果中,最後的元素是最大值。def bubble sort alist n len...