순차탐색
def linear_search_while(L: list, value: Any) -> int:
i = 0
while i < len(L) and L[i] != value:
i = i + 1
if i == len(L):
return -1
else:
return idef linear_search_sentinel(L: list, value: Any) -> int:
L.append(value) # Add the sentinel
i = 0
while L[i] != value:
i = i + 1
L.pop() # Remove the sentinel
if i == len(L):
return -1
else:
return idef linear_search_for(L: list, value: Any) -> int:
for i in range(len(L)):
if L[i] == value:
return i
return -1이진탐색
def binary_search(L: list, v: Any) -> int:
start, end = 0, len(L) – 1
while start != end + 1:
mid = (start+end) // 2
if L[mid] < v:
start = mid + 1
else:
end = mid - 1
if start < len(L) and L[start] == v:
return start
else:
return -1선택 정렬
def selection_sort(L: list) -> None:
for i in range(len(L)):
smallest = find_min(L, i)
L[i], L[smallest] = L[smallest], L[i] # swap
def find_min(L: list, start_idx: int) -> int:
smallest = start_idx # (1) Initialize smallest
for i in range(start_idx+1, len(L)): # (2) Update smallest
if L[i] < L[smallest]:
smallest = i
return smallest # (3) Return the final valuedef selection_sort(L: list) -> None:
for i in range(len(L)):
smallest = i
for j in range(i+1, len(L)):
if L[j] < L[smallest]:
smallest = j
L[i], L[smallest] = L[smallest], L[i] # swap삽입정렬
def insertion_sort(L: list) -> None:
for i in range(1, len(L)):
insert(L, i)
def insert(L: list, last_idx: int) -> None:
for i in range(last_idx,0,-1): # (1) Go backwards
if L[i-1] > L[i]: # (2) Check stopping condition
L[i-1], L[i] = L[i], L[i-1] # (3) Swap
else:
breakdef insertion_sort(L: list) -> None:
for i in range(1, len(L)):
for j in range(i,0,-1): # (1) Go backwards
if L[j-1] > L[j]: # (2) Check stopping condition
L[j-1], L[j] = L[j], L[j-1] # (3) Swap
else:
break피보나치 재귀
def fibonacci(n: int) -> int:
if n == 1 or n == 2:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)합병정렬
def mergeSortHelp(L: list, first: int, last: int) -> None:
if first == last: # Conditional statements
return # Base case
else:
mid = first + (last – first) // 2
mergeSortHelp(L, first, mid) # Recursive call for sublist1
mergeSortHelp(L, mid+1, last) # Recursive call for sublist2
merge(L, first, mid, last) # Merge the two (sorted) sublistsdef merge(L: list, first: int, mid: int, last: int) -> None:
k = first
sub1 = L[first:mid+1]
sub2 = L[mid+1:last+1]
i = j = 0
while i < len(sub1) and j < len(sub2):
if sub1[i] <= sub2[j]:
L[k] = sub1[i]
i = i+1
else:
L[k] = sub2[j]
j = j+1
k = k+1Tim Sort
Array
Linked List
class SLList():
def __init__(self) -> None:
self.first = None
def addFirst(self, x: int) -> None:
newFirst = LinkedNode(x)
newFirst.next = self.first
self.first = newFist
def getFirst(self) -> int:
if self.first:
return self.first.val
return Noneclass SLList():
def __init__(self) -> None:
self.first = None
self.size = 0
def addFirst(self, x: int) -> None:
newFirst = LinkedNode(x)
newFirst.next = self.first
self.first = newFirst
self.size += 1
def getFirst(self) -> int:
if self.first:
return self.first.val
return None
def getSize(self) -> int:
return self.size
def append(self, x: int) -> None:
self.size += 1
curNode = self.first
while(curNode.next != None):
curNode = curNode.next
curNode.next = LinkedNode(x)class SLList():
def __init__(self) -> None:
self.sentinel = LinkedNode(0)
self.size = 0
def addFirst(self, x: int) -> None:
newFirst = LinkedNode(x)
newFirst.next = self.sentinel.next
self.sentinel.next = newFirst
self.size += 1
def getFirst(self) -> int:
if self.sentinel.next:
return self.sentinel.next.val
return None
def getSize(self) -> int: # Improved with caching!
return self.size
def append(self, x: int) -> None: # Improved with sentinel!
self.size += 1
curNode = self.sentinel
while curNode.next != None:
curNode = curNode.next
curNode.next = LinkedNode(x)class TreeNode():
def __init__(self, x: int):
self.val = x
self.left = None
self.right = None
class BST():
def __init__(self):
self.root = None
def search(self, x: int):
def insert(self, x: int):
def delete(self, x: int):class Tree():
def visit(self, node: TreeNode):
print(node.val)
def BFT(self):
if self.root == None:
return
q = [self.root]
while q:
curNode = q.pop(0)
self.visit(curNode)
for childNode in curNode.child:
if childNode:
q.append(childNode)class Tree():
def visit(self, node: TreeNode):
print(node.val)
def BFT(self):
if self.root == None:
return
q = deque([self.root])
while q:
curNode = q.popleft()
self.visit(curNode)
for childNode in curNode.child:
if childNode:
q.append(childNode)class Tree():
def visit(self, node: TreeNode):
print(node.val)
def __DFT_preorderHelp(self, curNode: TreeNode):
if curNode == None:
return
self.visit(curNode)
for childNode in curNode.child:
self.__DFT_preorderHelp(childNode)
def DFT_preorder(self):
self.__DFT_preorderHelp(self.root)class Tree():
def visit(self, node: TreeNode):
print(node.val)
def __DFT_inorderHelp(self, curNode: TreeNode):
if curNode == None:
return
for i in range(len(curNode.child)):
if i == 1:
self.visit(curNode)
self.__DFT_inorderHelp(curNode.child[i])
def DFT_inorder(self):
self.__DFT_inorderHelp(self.root)class Tree():
def visit(self, node: TreeNode, size: float) -> None:
node.val += size
def __DFT_postorderHelp(curNode: TreeNode) -> float:
if not curNode:
return 0
subSize = 0
for i in range(len(curNode.child)):
subSize += self.__DFT_postorderHelp(curNode.child[i])
self.visit(curNode, subSize)
return curNode.val
def DFT_postorder(self) -> float:
return self.__DFT_postorderHelp(self.root)class undi_graph():
def __init__(self, V: list, E: list) -> None:
self.V = V[:]
self.neighbor = {}
for v in V:
self.neighbor[v] = []
for (v, w) in E:
self.neighbor[v].append(w)
self.neighbor[w].append(v)class undi_graph():
def __DFTHelp(self, visited: list, v: int) -> None:
if not visited[v]:
visited[v] = True
print(v)
for w in self.neighbor[v]:
self.__DFTHelp(visited, w)
def DFT(self) -> None:
if self.V:
visited = {}
for v in self.V:
visited[v] = False
for v in self.V:
self.__DFTHelp(visited, v)