快速排序
def partition ( arr, low, high) :
i = low - 1
pivot = arr[ high]
for j in range ( low, high) :
if arr[ j] <= pivot:
i = i + 1
arr[ i] , arr[ j] = arr[ j] , arr[ i]
arr[ i+ 1 ] , arr[ high] = arr[ high] , arr[ i+ 1 ]
return i+ 1
def quickSort ( arr, low, high) :
if low < high:
pi = partition( arr, low, high)
quickSort( arr, low, pi- 1 )
quickSort( arr, pi+ 1 , high)
arr = [ 10 , 7 , 8 , 5 , 6 , 20 ]
quickSort( arr, 0 , len ( arr) - 1 )
print ( arr)
堆排序
def heapify ( arr, n, i) :
largest = i
l = 2 * i + 1
r = 2 * i + 2
if l < n and arr[ largest] < arr[ l] :
largest = l
if r < n and arr[ largest] < arr[ r] :
largest = r
if largest != i:
arr[ i] , arr[ largest] = arr[ largest] , arr[ i]
heapify( arr, n, largest)
def heapSort ( arr) :
n = len ( arr)
for i in range ( n- 1 , - 1 , - 1 ) :
heapify( arr, n, i)
for i in range ( n- 1 , 0 , - 1 ) :
arr[ i] , arr[ 0 ] = arr[ 0 ] , arr[ i]
heapify( arr, i, 0 )
arr = [ 10 , 7 , 8 , 5 , 6 , 20 ]
heapSort( arr)
print ( arr)
归并排序
def merge ( arr, l, m, r) :
n1, n2 = m- l+ 1 , r- m
L, R = arr[ l: m+ 1 ] , arr[ m+ 1 : r+ 1 ]
i, j, k = 0 , 0 , l
while i < n1 and j < n2:
if L[ i] <= R[ j] :
arr[ k] = L[ i]
i += 1
else :
arr[ k] = R[ j]
j += 1
k += 1
while i < n1:
arr[ k] = L[ i]
i += 1
k += 1
while j < n2:
arr[ k] = R[ j]
j += 1
k += 1
def mergeSort ( arr, l, r) :
if l < r:
m = ( l+ r) // 2
mergeSort( arr, l, m)
mergeSort( arr, m+ 1 , r)
merge( arr, l, m, r)
arr = [ 10 , 7 , 8 , 5 , 6 , 20 ]
mergeSort( arr, 0 , len ( arr) - 1 )
print ( arr)
前中后序遍历(递归法)
class Solution :
def Traversal ( self, root: TreeNode) - > List[ int ] :
if not root:
return [ ]
return [ root. val] + self. Traversal( root. left) + self. Traversal( root. right)
class Solution :
def Traversal ( self, root: TreeNode) - > List[ int ] :
def dfs ( cur) :
if not cur:
return
res. append( cur. val)
dfs( cur. left)
dfs( cur. right)
res = [ ]
dfs( root)
return res
前中后序遍历(迭代法)
class Solution :
def preorderTraversal ( self, root: TreeNode) - > List[ int ] :
if not root:
return [ ]
stack = [ root]
result = [ ]
while stack:
node = stack. pop( )
result. append( node. val)
if node. right:
stack. append( node. right)
if node. left:
stack. append( node. left)
return result
class Solution :
def inorderTraversal ( self, root: TreeNode) - > List[ int ] :
if not root:
return [ ]
stack = [ ]
result = [ ]
cur = root
while cur or stack:
if cur:
stack. append( cur)
cur = cur. left
else :
cur = stack. pop( )
result. append( cur. val)
cur = cur. right
return result
class Solution :
def postorderTraversal ( self, root: TreeNode) - > List[ int ] :
if not root:
return [ ]
stack = [ root]
result = [ ]
while stack:
node = stack. pop( )
result. append( node. val)
if node. left:
stack. append( node. left)
if node. right:
stack. append( node. right)
return result[ : : - 1 ]
并查集
class UnionFind :
def __init__ ( self, n) :
self. parent = list ( range ( n) )
def union ( self, index1, index2) :
self. parent[ self. find( index2) ] = self. find( index1)
def find ( self, index) :
if self. parent[ index] != index:
self. parent[ index] = self. find( self. parent[ index] )
return self. parent[ index]
二分查找
def binary_search ( nums, target) :
left, right = 0 , len ( nums) - 1
while left <= right:
mid = ( left + right) // 2
if nums[ mid] < target:
left = mid + 1
elif nums[ mid] > target:
right = mid - 1
else :
return mid
return None
def left_bound ( nums, target) :
left, right = 0 , len ( nums) - 1
while left <= right:
mid = ( left + right) // 2
if nums[ mid] < target:
left = mid + 1
elif nums[ mid] > target:
right = mid - 1
else :
right = mid - 1
if left >= len ( nums) or nums[ left] != target:
return None
return left
def right_bound ( nums, target) :
left, right = 0 , len ( nums) - 1
while left <= right:
mid = ( left + right) // 2
if nums[ mid] < target:
left = mid + 1
elif nums[ mid] > target:
right = mid - 1
else :
left = mid + 1
if right < 0 or nums[ right] != target:
return None
return right
Kmean
import random
class K_means ( ) :
def __init__ ( self, datas, n_cluster) :
self. datas = datas
self. n_cluster = n_cluster
self. clusers_have = { }
self. datas_belong = [ 0 for _ in range ( len ( datas) ) ]
self. cluser_points = [ ]
for i in range ( self. n_cluster) :
self. cluser_points. append( [ random. uniform( 0 , 5 ) , random. uniform( 0 , 5 ) ] )
self. clusers_have[ i] = [ ]
def l2_distance ( self, x, y) :
return ( x[ 0 ] - y[ 0 ] ) * ( x[ 0 ] - y[ 0 ] ) + ( x[ 1 ] - y[ 1 ] ) * ( x[ 1 ] - y[ 1 ] )
def fit ( self, iter_num= 100 ) :
for _ in range ( iter_num) :
for cluser_idx in self. clusers_have. keys( ) :
self. clusers_have[ cluser_idx] = [ ]
for i, data in enumerate ( self. datas) :
for j, cluster_point in enumerate ( self. cluser_points) :
if j == 0 :
min_distance = self. l2_distance( data, cluster_point)
nearest_cluster = j
else :
distance = self. l2_distance( data, cluster_point)
if distance < min_distance:
min_distance = distance
nearest_cluster = j
self. datas_belong[ i] = nearest_cluster
self. clusers_have[ nearest_cluster] . append( i)
for j, cluster_point in enumerate ( self. cluser_points) :
new_point = [ 0 , 0 ]
for i in self. clusers_have[ j] :
new_point[ 0 ] += datas[ i] [ 0 ]
new_point[ 1 ] += datas[ i] [ 1 ]
new_point[ 0 ] /= len ( self. clusers_have[ j] )
new_point[ 1 ] /= len ( self. clusers_have[ j] )
self. cluser_points[ j] = new_point
print ( self. cluser_points)
def predict ( self, new_point) :
for j, cluser_point in enumerate ( self. cluser_points) :
if j == 0 :
min_distance = self. l2_distance( new_point, cluser_point)
nearest = j