排序演算法概覽

2021-09-25 18:43:04 字數 4159 閱讀 2930

以此類推,使最大的數沉底,再從頭開始比較,最終完成排序

**:

def

bubble_sort

(li)

:for i in

range

(len

(li)-1

):for j in

range

(len

(li)

-i-1):

if li[j]

> li[j+1]

: li[j]

, li[j+1]

= li[j+1]

, li[j]

# 時間複雜度為o(n**2)

如果氣泡排序中執行一趟而沒有交換,則列表已經是有序狀態,可以直接結束演算法。

def

bubble_sort_1

(li)

:for i in

range

(len

(li)-1

):exchange =

false

for j in

range

(len

(li)

-i-1):

if li[j]

> li[j+1]

: li[j]

, li[j+1]

= li[j+1]

, li[j]

exchange =

true

ifnot exchange:

return

演算法思想:一趟遍歷記錄最小的數,放到第乙個位置;再一趟遍歷記錄剩餘列表中最小的數,繼續放置;

直到完成排序。

**:
def

select_sort

(li)

:for i in

range

(len

(li)-1

):min_loc = i

for j in

range

(i+1

,len

(li)):

if li[j]

< li[min_loc]

: min_loc = j

if min_loc != i:

li[i]

, li[min_loc]

= li[min_loc]

, li[i]

# 時間複雜度為o(n**2)

演算法思想:列表被分為有序區和無序區兩個部分。最初有序區只有乙個元素。

每次從無序區選擇乙個元素,插入到有序區的位置,直到無序區變空。

**:
def

insert_sort

(li)

:for i in

range(1

,len

(li)):

tmp = li[i]

j = i -

1while j >=

0and tmp < li[j]

: li[j +1]

= li[j]

j = j -

1 li[j +1]

= tmp

# 時間複雜度為o(n**2)

快排演算法方便快捷,既好寫,執行速度又快,可以大大提高執行效率

演算法思路:

1,取乙個元素p(第乙個元素),使元素p歸位;

, 2,列表被p分成兩部分,左邊都比p小,右邊都比p大;

3,遞迴完成排序。

**:
#第一步:

defquick_sort

(data, left, right)

:if left < right:

mid = partition(data, left, right)

quick_sort(data, left, mid -1)

quick_sort(data, mid +

1, right)

# 第二步:

defpartition

(data, left, right)

: tmp = data[left]

while left < right:

while left < right and data[right]

>= tmp:

right -=

1 data[left]

= data[right]

while left < right and data[left]

<= tmp:

left +=

1 data[right]

= data[left]

data[left]

= tmp

return left

使用二叉樹完成的排序。

演算法思路:

1,建立堆

2,得到堆頂元素,為最大元素

3,去掉堆頂,將堆最後乙個元素放到堆頂,此時可通過一次調整重新使堆有序。

4,堆頂元素為第二大元素。

5,重複步驟3,直到堆變空。

**:
def

sift

(data, low, high)

: i = low

j =2* i +

1 tmp = data[i]

while j <= high:

if j < high and data[j]

< data[j +1]

: j +=

1if tmp < data[j]

: data[i]

= data[j]

i = j

j =2* i +

1else

:break

data[i]

= tmp

defheap_sort

(data)

: n =

len(data)

for i in

range

(n //2-

1,-1

,-1)

: sift(data, i, n -1)

for i in

range

(n -1,

-1,-

1): data[0]

, data[i]

= data[i]

, data[0]

sift(data,

0, i -

1)

演算法思路:

1,分解,把列表越分越小,直至分為乙個元素。單個元素是有序的。

2,將有序的列表兩兩歸併,列表越來越大,

**:
def

merge

(li, low, mid, high)

: i = low

j = mid +

1 ltmp =

while i <= mid and j <= high:

if li[i]

<= li[j]:)

i +=

1else:)

j +=

1while i <= mid:

) i +=

1while j <= high:

) j +=

1 li[low:high +1]

= ltmp

defmergesort

(li, low, high)

:if low < high:

mid =

(low + high)//2

mergesort(li, low, mid)

mergesort(li, mid +

1, high)

merge(li, low, mid, high)

# 時間複雜度:o(nlogn)

# 空間複雜度:o(n)

三種排序演算法的時間複雜度都是o(nlogn)

一般情況下,就執行時間而言:

快速排序 < 歸併排序 < 堆排序
三種排序演算法的缺點:
快速排序:極端情況下排序效率低

歸併排序:需要額外的記憶體開銷

堆排序:在快的排序演算法中相對較慢

索引演算法概覽

索引技術是通過有結構 無結構的資料以一定規則儲存在相應介質上,並同時提供一種訪問方式的技術。從定義中可以看出,索引技術的核心是關於如何儲存與訪問資訊,當在實際問題中面臨選擇何種索引技術或工具時,首先需要了解資料量的大小 資料的格式,是即時訪問還是批量查詢等等,有時還需要結合儲存介質,比如是否使用快取...

十大排序演算法整理(一) 概覽

十大排序演算法分類 特點和關係 1 氣泡排序 交換排序的一種 2 選擇排序 3 插入排序 4 歸併排序 採用了分治思想,額外的空間複雜度o n 容易記錯,最後合併大陣列的時候需要開闢乙個長度為n的陣列 5 快速排序 採用了分治思想,交換排序的一種,額外的空間複雜度o nlogn 容易記錯 6 堆排序...

《演算法導論》筆記 動態規劃概覽

什麼問題適合使用動態規劃來解決?如果乙個問題具有以下兩個特徵,那麼就可能適合用動態規劃來解決 如果乙個問題的最優解包含著該問題的子問題的最優解,那麼這個問題就具有最優子結構。擁有最優子結構特徵的問題,就有可能用動態規劃來解決 當然,也有可能用貪婪演算法 在遞迴式中,乙個問題的子問題,以及子子問題的解...