排序演算法小結

2021-10-19 08:16:56 字數 2701 閱讀 8423

1.二分法

利用元素間次序關係,將元素集進行對半查詢

時間複雜度o(logn)

思路:二分法遍歷陣列,直到找到陣列下標與元素不符的情況

if nums ==

:return

0if nums[-1

]==len(nums)-1

:return

len(nums)

left =

0 right =

len(nums)-1

while left

if nums[

(left+right)//2

]!=(left+right)//2

: right=

(left+right)//2

else

: left =

(left+right)//2

+1return left

2.快速排序a.將基準元素分解為a[p,q-1] a[q] a[q+1:],使得a[p:q-1]中任意乙個元素小於a[q],右邊任意乙個元素大於

b.遞迴排序

*關鍵在於盡可能低複雜度地獲得排序,mid為中位數

:#快排,保證mid是中間數

defquicksort

(a,p,r)

:if p < r:

loc=p

for i in

range

(p+1

,r+1):

if a[i]

< a[p]

: loc+=

1print

(loc,i)

if i != loc:

a[i]

,a[loc]

=a[loc]

,a[i]

a[p]

,a[loc]

=a[loc]

,a[p]

if loc>p:

quicksort(a,p,loc-1)

if loc

quicksort(a,loc+

1,r)

quicksort(arr,0,

len(arr)-1

)#print(arr)

return arr[

0:k]

3.合併排序將元素集分成大小接近的兩個子集和,分別對兩個子集和進行排序,最終將排好的子集和合併到所要求的排好序的集合

時間複雜度為o(nlogn)

def

merge

(a,b,left,right)

: mid=

(left+right)//2

+1i,j=left,mid

while i < mid and j <=right:

if a[i]

<=a[j]:)

i+=1else:)

j+=1 b.extend(a[i:mid]

) b.extend(a[j:right+1]

) a[left:right+1]

=b

defmergesort

(a,left,right)

: b=

if left

mergesort(a,left,

(left+right)//2

) mergesort(a,

(left+right)//2

+1,right)

merge(a,b,left,right)

mergesort(nums1,0,

len(nums1)-1

)mergesort(nums2,0,

len(nums2)-1

)

4.氣泡排序把相鄰元素依次比較,大的放右邊,依次迴圈

時間複雜度o(n^2)

def

sort

(a):

for i in

range

(len

(a))

:#每次排序後使得最大值在後面,已排序的不再排序,保證j在最大值獲得最大

for j in

range

(len

(a)-i-1)

:if a[j]

>a[j+1]

: a[j]

,a[j+1]

=a[j+1]

,a[j]

sort(nums1)

排序演算法小結

1 快速排序 quicksort 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來說,它是歸併排序的就地版本。快速排序可以由下面四步組成。1 如果不多於1個資料,直接返回。2 一般選擇序列最左邊的值作為支點資料。3 將序列分成2部分,一部分都大於支點資料,另外一部分都小於支點資料。4...

排序演算法小結

1 歸併排序 3.區別與聯絡 遞迴是從未知推到已知,相當於把未知的東西壓入棧,等到可以算出結果了,就一步一步出棧。迭代是從已知到未知,從已知的東西一步一步推至目標。遞迴與迭代就好像一對逆元。遞迴的 更加清晰,但開銷更大,也更容易出錯,除錯較困難 而迭代的 編寫更困難,但速度和開銷較小。4.空間占用 ...

排序演算法小結

演算法過程 假設乙個無序的序列,該演算法將其分成兩部分,前一部分已經完成排序 有序,一開始時只有乙個元素 後一部分任然無序,將後面序列選擇第乙個插入到前面的有序序列,如此直到所有完全有序。複雜度 最簡單的即為,整個序列原來即有序,按照一種最 省事 的方式,我們僅需比較n 1次即可。最複雜的情況,應該...