ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 정렬 알고리즘 및 자료구조 구현
    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
Designed by Tistory.