Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- Machine Learning
- 스택
- 해시테이블
- 연결리스트
- 이진탐색
- 프로세스
- 컨테이너
- 프론트엔드
- pytorch
- 웹팩
- vue3
- 타입스크립트
- 코딩테스트
- C
- cors
- RxJS
- GraphQL
- 연결 리스트
- 자바스크립트
- APOLLO
- 알고리즘
- 프로그래머스
- 배열
- 브라우저
- alexnet
- 포인터
- 자료구조
- 릿코드
- 큐
- RT scheduling
Archives
- Today
- Total
프린세스 다이어리
Sort Algorithms: Bubble Sort, Selection Sort, Insertion Sort in Python 본문
자료구조, 알고리즘
Sort Algorithms: Bubble Sort, Selection Sort, Insertion Sort in Python
개발공주 2023. 6. 30. 00:02728x90
너무 헷갈리고 어려워서 정리. 특히 Linked List 버전으로 작성하기 까다로웠음
1. Bubble Sort
1.1. List
# 오른쪽 엘리먼트랑 비교해서 내가 더 크면 쭉쭉 오른쪽꺼랑 swap해줌
# 점점 큰 엘리먼트를 오른쪽에 먼저 보낸다는 게 버블같다는 의미에서 Bubble sort
def bubble_sort(list):
for i in range(len(list) - 1, 0, -1):
for j in range(i):
if list[j] > list[j + 1]:
temp = list[j]
list[j] = list[j + 1]
list[j + 1] = temp
return list
my_list = [3, 1, 5, 2, 4]
print(bubble_sort(my_list))
1.2. Linked List
def bubble_sort(self):
if self.length <= 1: return False
sorted_until = None
while sorted_until != self.head.next:
curr = self.head
while curr.next != sorted_until:
next_node = curr.next
if next_node.value < curr.value:
next_node.value, curr.value = curr.value, next_node.value
curr = curr.next
sorted_until = curr
2. Selection Sort
2.1. List
# i 돌면서, i 다음 인덱스들을 j로 돌며 제일 작은 값의 인덱스를 업뎃해줌
# 인덱스 업뎃하고 나면 i인덱스의 값이랑 비교해서 작을 때 i 인덱스의 값이랑 바꿈
# min_index를 골라잡아서 바꾼다는 의미로 selection sort인가 싶음
def selection_sort(list):
for i in range(len(list) - 1):
min_index = i
for j in range(i + 1, len(list)):
if list[j] < list[min_index]:
min_index = j
if i != min_index:
temp = list[min_index]
list[min_index] = list[i]
list[i] = temp
return list
my_list = [5, 1, 8, 23, 6]
print(selection_sort(my_list))
2.2. Linked List
def selection_sort(self):
if self.length < 2:
return
# sort curr temp
# 1 -> 3 -> 8 -> 4
curr = self.head
while curr.next:
min_node = curr
temp = curr.next
while temp:
if temp.value < min_node.value:
min_node = temp
temp = temp.next
if curr != min_node:
curr.value, min_node.value = min_node.value, curr.value
curr = curr.next
3. Insertion Sort
3.1. List
# bubble sort랑 비슷한데, 버블은 for문 두개로 돌면서 swap한다면
# 이건 왼쪽이랑 비교해서 필요한 때만 오른쪽 index로 땡겨주는 개념인 것 같음.
# 따라서 베스트 케이스에는 O(N) time complexity가 소요됨
# i인덱스 값을 temp로 빼 놨다가, 오른쪽 인덱스 값들을 필요한 만큼 다 옮기고 나서 빈자리에 넣어준다는 의미에서 insertion sort 같음
def insertion_sort(list):
for i in range(1, len(list)):
temp = list[i]
j = i - 1
while list[j] > temp and j > -1:
list[j + 1] = list[j] # 서로 바꾼다기보단 옆으로 한 칸 간다는 의미에서.
list[j] = temp
j -= 1
return list
my_list = [4, 5, 1, 13, 6, 9]
print(insertion_sort(my_list))
3.2. Linked List
def insertion_sort(self):
if self.length < 2:
return
#sort temp curr
#head -> 2 -> 7
# 1 -> 3 -> 5
sorted_head = self.head
unsorted_head = self.head.next
sorted_head.next = None # 끊음
while unsorted_head:
curr = unsorted_head
unsorted_head = unsorted_head.next
if sorted_head.value > curr.value:
curr.next = sorted_head
sorted_head = curr
else:
search_pointer = sorted_head
while search_pointer.next and search_pointer.next.value < curr.value:
search_pointer = search_pointer.next
curr.next = search_pointer.next
search_pointer.next = curr
self.head = sorted_head
temp = self.head
while temp.next:
temp = temp.next
self.tail = temp
728x90
'자료구조, 알고리즘' 카테고리의 다른 글
[Algospot] 고대어 사전 문제 자바스크립트 풀이 (0) | 2022.04.17 |
---|---|
[LeetCode] K-th Symbol in Grammar - 자바스크립트 풀이 (0) | 2021.12.12 |
[LeetCode] Merge Two Sorted Lists - 자바스크립트 풀이 (0) | 2021.12.07 |
[LeetCode] Climbing Stairs - 자바스크립트 풀이 (0) | 2021.12.06 |
[LeetCode] Fibonacci Number - 자바스크립트 풀이 (0) | 2021.12.05 |
Comments