-
삽입정렬 python insertionSort (배열, 링크드리스트로 구현)알고리즘/정렬 2022. 11. 29. 20:14
삽입정렬
출처를 정확히 모르겠음.. 삽입정렬은 인덱스를 하나씩 이동하며, 이미 정렬된 이전인덱스들과 비교하여 값을 교환하는 방식이다
그림에서 볼 수 있듯이 이미 정렬된 값들이 새로운 인덱스보다 큰 경우가 많으면 교환을 많이 해야 하지만!
운이 좋아서 새로운 인덱스의 값이 이미 정렬된 값들의 최댓값보다 크면 과정을 한번 건너뛸 수 있다!
그래서 시간복잡도를 보면 빅오는 O(n^2) 이지만 빅오메가는 Ω(n)인 복불복 정렬 알고리즘이다
배열로 삽입정렬 구현
def sortInsertionInArray(array): temp = None for i in range(len(array)): for j in range(i): if array[i-j] < array[i-j-1]: temp = array[i-j] array[i-j] = array[i-j-1] array[i-j-1] = temp else: break return
시간복잡도를 획기적으로 줄여주는 else: break 가 삽입정렬의 핵심이다
까먹고 안써도 잘 돌아가지만, 그러면 버블정렬보다도 심각한 최악의 알고리즘이 되버림
링크드리스트로 삽입정렬 구현
↓이전글의 링크드리스트가 반드시 필요하다
2022.11.25 - [자료구조] - python 알고리즘용 LinkedList
def sortInsertion(self): if self.head is None: return None elif self.head.next is None: return None idx = self.head curr = None tempValue = None while idx is not None: curr = idx while curr.prev is not None: if curr.data < curr.prev.data: tempValue = curr.data curr.data = curr.prev.data curr.prev.data = tempValue else: break curr = curr.prev idx = idx.next return
여기에는 노드를 이동하며 전부 값을 교환시켜주었지만,
링크드리스트로 구현을 할 때는 값을 교환하는 과정을 줄일 수도 있다.
값을 교환하며 이동하는게 아니라 선택정렬 처럼 들어갈 위치만 알아내고 두 노드끼리 바꿔치기만 해도 됨!
(그럼 약간 변형된 선택정렬이 아닌가? 싶네)
배열처럼 인덱스 기준의 접근이 아니기 때문에 가능한 방법이다.
약간의 효율성이 증가할 듯 하다.
하지만 n^2 앞에서 무슨 의미가 있으리.. 그냥 두기로 했다.
나중에 심심하면 시도해 보는걸로
'알고리즘 > 정렬' 카테고리의 다른 글
선택정렬 python selctionSort (배열, 링크드리스트로 구현) (0) 2022.11.29 버블정렬 python bubbleSort ( 배열, 링크드리스트로 구현) (0) 2022.11.25