-
정렬 알고리즘 및 자료구조 구현algorithm 2024. 4. 11. 23:57
정렬 알고리즘
1. 버블 정렬
def bubbleSort1(arr): for i in range(len(arr)): for j in range(len(arr) - 1): if arr[j] > arr[j + 1]: temp = arr[j] arr[j] = arr[j + 1] arr[j + 1] = temp def bubbleSort2(arr): idx = 0 temp = 0 while idx < len(arr): for i in range(len(arr) - 1): if arr[i + 1] < arr[i]: temp = arr[i] arr[i] = arr[i + 1] arr[i + 1] = temp idx += 1 arr = [3, 1, 5, 2, 4] bubbleSort2(arr) print(arr)
2. 삽입 정렬def insertSort(arr): for i in range(1, len(arr)): val = arr[i] idx = i - 1 while idx >= 0 and arr[idx] > val: arr[idx + 1] = arr[idx] idx -= 1 arr[idx + 1] = val arr = [3, 1, 2, 5, 2, 4, 2] insertSort(arr) print(arr)
3. 병합 정렬def mergeSort(arr, st, en): # 종료조건 if en - st < 1: return # 분할 mid = (st + en) // 2 mergeSort(arr, st, mid) mergeSort(arr, mid + 1, en) # 정복 merge(arr, st, mid, en) def merge(arr, st, mid, en): temp = [] p1 = st p2 = mid + 1 while p1 <= mid and p2 <= en: if arr[p1] <= arr[p2]: temp.append(arr[p1]) p1 += 1 else: temp.append(arr[p2]) p2 += 1 while p1 <= mid: temp.append(arr[p1]) p1 += 1 while p2 <= en: temp.append(arr[p2]) p2 += 1 for i in range(st, en + 1): arr[i] = temp[i - st] arr = [3, 1, 4, 2, 5, 3] mergeSort(arr, 0, len(arr) - 1) print(arr)
4. 퀵 정렬def swap(arr, idx1, idx2): temp = arr[idx1] arr[idx1] = arr[idx2] arr[idx2] = temp def partition(arr, st, en): p1, p2 = st + 1, en while p1 < p2: while arr[st] > arr[p1]: p1 += 1 while arr[st] < arr[p2]: p2 -= 1 if p1 < p2: swap(arr, p1, p2) swap(arr, st, p2) return p2 def quickSort(arr, st, en): if st >= en: return pivot = partition(arr, st, en) quickSort(arr, st, pivot - 1) quickSort(arr, pivot + 1, en) arr = [3, 1, 4, 2, 5, 1] quickSort(arr, 0, len(arr) - 1) print(arr)
5. 선택 정렬def swap(arr, i, j): temp = arr[i] arr[i] = arr[j] arr[j] = temp def selectSort(arr): minIdx = 0 for i in range(len(arr)): minIdx = i for j in range(i + 1, len(arr)): if arr[j] < arr[minIdx]: minIdx = j if i != minIdx: swap(arr, i, minIdx) arr = [3, 1, 44, 2, 9] selectSort(arr) print(arr)
6. 이진 탐색def binarySearchSort(arr, num): st, en = 0, len(arr) - 1 while st <= en: mid = (st + en) // 2 val = arr[mid] if val < num: st = mid + 1 elif val > num: en = mid - 1 else: return mid arr = [1, 4, 5, 7, 9] num = 7 print(binarySearchSort(arr, num))
자료구조
1. 스택
class StackNode: def __init__(self, data = 0): self.data = data self.next = None class Stack: def __init__(self): self.top = None def pop(self): if self.top == None: return -1 temp, self.top = self.top.data, self.top.next return temp def push(self, data): node = StackNode(data) node.next = self.top self.top = node def peek(self): if not self.top: return -1 return self.top.data def isEmpty(self): return self.top == None st = Stack() arr = [3, 1, 45, 2, 56] for num in arr: st.push(num) while not st.isEmpty(): print(st.peek(), st.pop())
2. 큐class QueueNode: def __init__(self, data): self.data = data self.next = None class Queue: def __init__(self): self.first = None self.last = None def add(self, data): node = QueueNode(data) if self.last: self.last.next = node self.last = node if not self.first: self.first = self.last def remove(self): if not self.first: return -1 data = self.first.data self.first = self.first.next if not self.first: self.last = None return data def peek(self): if not self.first: return -1 return self.first.data def isEmpty(self): return self.first == None q = Queue() arr = [3, 1, 45, 6, 2, 1] for num in arr: q.add(num) while not q.isEmpty(): print(q.peek(), q.remove())
3. 힙MAX_HEAP_SIZE = 200 class Heap: def __init__(self): self.heapSize = 0 self.heap = [0 for _ in range(MAX_HEAP_SIZE)] def append(self, item): self.heapSize += 1 idx = self.heapSize # 부모가 더 작으면 위로 올라감. while idx != 1 and item > self.heap[idx//2]: self.heap[idx] = self.heap[idx//2] idx //= 2 self.heap[idx] = item def pop(self): if self.heapSize == 0: return -1 topNode = self.heap[1] lastNode = self.heap[self.heapSize] self.heapSize -= 1 parent = 1 child = 2 # 자식이 더 크면 밑으로 내려감. while child <= self.heapSize: # parent의 자식 중 더 큰 자식을 고른다. if child < self.heapSize and (self.heap[child] < self.heap[child + 1]): child += 1 # lastNode가 child와 같거나 크면 lastNode를 이 두 자식의 부모로 삼음. if lastNode >= self.heap[child]: break # lastNode가 더 작으면 자식을 부모로 옮기고 다시 확인 self.heap[parent] = self.heap[child] parent = child child *= 2 self.heap[parent] = lastNode return topNode def isEmpty(self): return self.heapSize == 0 arr = [3, 1, 4, 2, 9] h = Heap() for num in arr: h.append(num) while not h.isEmpty(): print(h.pop())
총평
면접시 손코딩을 대비해서 기본적인 정렬 알고리즘과 자료구조 구현을 연습해보았습니다.
정렬 알고리즘에 어떤 것들이 있는지는 잘 알고 있었지만, 각각의 알고리즘이 어떤식으로 구현되어 있는지는 잘 알고 있지 못하고 있는 것을 발견했습니다.
그래서 하나씩 재밌게 구현해보았습니다.'algorithm' 카테고리의 다른 글
머지 소트의 시간복잡도 (0) 2024.04.06