選擇排序,快速排序

2021-10-09 22:42:55 字數 2734 閱讀 9265

二、快速排序

學習各種排序演算法,後續會繼續補充。

例:對資料從小到大進行排序

先在列表中檢查每個元素找到最小的;需要的時間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...