基礎排序演算法總覽

2021-10-08 21:00:30 字數 3974 閱讀 5266

比較相鄰的兩元素,不滿足大小關係則互換,一次遍歷能將乙個元素放到正確的位置上。完成排序需要n次遍歷,則事件複雜度o(n^2),可以不使用額外的資料結構,則空間複雜度為o(1),可以相等時不交換,則是穩定的排序演算法。

python3**大致如下:

from typing import list

defbubblesort

(nums: list[

int])-

>

none

: n =

len(nums)

if n <2:

return

for i in

range(0

, n)

:for j in

range(0

, n-i-1)

:if nums[j]

< nums[j+1]

: nums[j]

,nums[j+1]

= nums[j+1]

, nums[j]

nums =[2

,3,5

,7,1

,9,3

]bubblesort(nums)

print

(nums)

開始將第乙個元素劃分為有序區間,後面為無序區間,逐步將無序區間的元素插入到有些區間中。兩層迴圈,乙個區間劃分遍歷一次資料,第二層插入資料,大致為o(n^2),空間複雜度為o(1),資料相等時不交換,穩定的排線演算法。**大致如下:

from typing import list

definsertionsort

(nums: list[

int])-

>

none

: n =

len(nums)

if n <2:

return

for i in

range(1

, n)

: value = nums[i]

# 尋找插入的位置

j = i -

1while j >-1

:# 資料往後移

if nums[j]

< value:

nums[j+1]

= nums[j]

else

:break

j = j -

1# 插入資料

nums[j+1]

= value

nums =[2

,3,5

,7,1

,9,3

]insertionsort(nums)

print

(nums)

開始劃分1個有序區間,後面查詢最小或最大元素放入區間內。時間複雜度o(n^2),空間o(1),不穩定。**大致如下:

from typing import list

defselectsort

(nums: list[

int])-

>

none

: n =

len(nums)

if n <2:

return

for i in

range(0

, n-1)

:for j in

range

(i+1

, n)

:if nums[i]

< nums[j]

: nums[i]

, nums[j]

= nums[j]

, nums[i]

nums =[2

,3,5

,7,1

,9,3

]selectsort(nums)

print

(nums)

使用分治的思路,把陣列分成兩半,分別排序,排序後進行合併。大致**如下:

from typing import list

defmergesort

(nums: list[

int])-

> list[

int]

: n =

len(nums)

if n ==1:

return nums

mid = n //

2 lsort = mergesort(nums[

:mid]

) rsort = mergesort(nums[mid:])

return merge(lsort, rsort)

defmerge

(nums1: list[

int]

, nums2: list[

int])-

> list[

int]

: nums =

n =len(nums1)

m =len(nums2)

index1 =

0 index2 =

0while index1 < n or index2 < m:

if index1 >= n:

) index2 = index2 +

1elif index2 >= m:

) index1 = index1 +

1elif nums1[index1]

< nums2[index2]:)

index1 = index1 +

1else:)

index2 = index2 +

1return nums

nums =[2

,3,5

,7,1

,9,3

]print

(mergesort(nums)

)

也是使用分治的思路,隨機選取其中乙個數最為分界點,把小於其的數反左邊或右邊,大於其的數類似。大致**如下:

from typing import list

defquicksort

(nums: list[

int]

, start:

int, end:

int)

->

none

:if start >= end:

return

mid = partition(nums, start, end)

# 注意後面排序的序號,排序是不包括分界元素的

quicksort(nums, start, mid-1)

quicksort(nums, mid+

1, end)

defpartition

(nums: list[

int]

, start:

int, end:

int)

->

int:

""" 選取最後乙個元素為分界,小於的放左,使用了雙指標交換元素

"""value = nums[end]

index = start

for i in

range

(start, end)

:if nums[i]

< value:

nums[i]

, nums[index]

= nums[index]

, nums[i]

index = index +

1 nums[index]

, nums[end]

= nums[end]

, nums[index]

return index

nums =[2

,3,5

,7,1

,9,3

]quicksort(nums,0,

len(nums)-1

)print

(nums)

基礎排序演算法總覽

比較相鄰的兩元素,不滿足大小關係則互換,一次遍歷能將乙個元素放到正確的位置上。完成排序需要n次遍歷,則事件複雜度o n 2 可以不使用額外的資料結構,則空間複雜度為o 1 可以相等時不交換,則是穩定的排序演算法。python3 大致如下 from typing import list def bub...

八大排序演算法總覽

插入排序 1 直接插入排序 穩定排序,時間複雜度o n 2 2 希爾排序 直接插入排序的優化,非穩定排序,時間複雜度o n 1 3 選擇排序 1 簡單選擇排序 非穩定排序,時間複雜度o n 2 2 堆排序 非穩定排序,時間複雜度o nlogn 用於topk問題 交換排序 1 氣泡排序 穩定排序,時間...

Web基礎題總覽

題目特徵明顯 sql注入 登入框,變化的url引數 f12原始碼分析 注釋提示 隱藏路徑 了解伺服器的資訊隱藏的配置檔案,自己進行推理 登入後台型別 偽造本地位址,爆破,萬能密碼,cookie欺騙 看原始碼可以右鍵 檢視網頁源 也可以用火狐和谷歌瀏覽器的按f12鍵,按f12鍵可以修改html源 方便...