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次即可。最複雜的情況,應該...