티스토리 뷰
728x90
반응형
합병 정렬 : 두 개의 리스트를 하나의 정렬된 리스트로 합병하는 정렬 알고리즘
퀵 정렬 : 기준점보다 작은 것은 왼쪽에, 큰 것은 오른쪽에 정렬하는 정렬 알고리즘
1. 합병 정렬(Merge Sort) 구현
'''
# 시간복잡도 : O(NlogN)
'''
def merge(list1, list2):
i = 0
j = 0
# 정렬된 항목들을 담을 리스트
merged_list = []
# list1과 list2를 돌면서 merged_list에 항목 정렬
while i < len(list1) and j < len(list2):
if list1[i] > list2[j]:
merged_list.append(list2[j])
j += 1
else:
merged_list.append(list1[i])
i += 1
# list2에 남은 항목이 있으면 정렬 리스트에 추가
if i == len(list1):
merged_list += list2[j:]
# list1에 남은 항목이 있으면 정렬 리스트에 추가
elif j == len(list2):
merged_list += list1[i:]
return merged_list
def merge_sort(my_list):
# base case
if len(my_list) < 2:
return my_list
# my_list를 반씩 나눈다(divide)
left_half = my_list[:len(my_list)//2] # 왼쪽 반
right_half = my_list[len(my_list)//2:] # 오른쪽 반
# merge_sort 함수를 재귀적으로 호출하여 부분 문제 해결(conquer)하고,
# merge 함수로 정렬된 두 리스트를 합쳐(combine)준다
return merge(merge_sort(left_half), merge_sort(right_half))
# 테스트
print(merge_sort([1, 3, 5, 7, 9, 11, 13, 11]))
print(merge_sort([28, 13, 9, 30, 1, 48, 5, 7, 15]))
print(merge_sort([2, 5, 6, 7, 1, 2, 4, 7, 10, 11, 4, 15, 13, 1, 6, 4]))
2. 퀵 정렬(Quick Sort) 구현
# 두 요소의 위치를 바꿔주는 함수
def swap(lst, index1, index2):
temp = lst[index1]
lst[index1] = lst[index2]
lst[index2] = temp
# 퀵 정렬에서 사용되는 partition 함수
def partition(lst, start, end):
# 리스트 값 확인과 기준점 이하 값들의 위치 확인을 위한 변수 정의
i = start
b = start
p = end
# 범위안의 모든 값들을 볼 때까지 반복문을 돌린다
while i < p:
# i 인덱스의 값이 기준점보다 작으면 i와 b 인덱스에 있는 값들을 교환하고 b를 1 증가 시킨다
if lst[i] <= lst[p]:
swap(lst, i, b)
b += 1
i += 1
# b와 기준점인 p 인덱스에 있는 값들을 바꿔준다
swap(lst, b, p)
p = b
# pivot의 최종 인덱스를 리턴해 준다
return p
# 퀵 정렬
def quicksort(lst, start, end):
# base case
if end - start < 1:
return
# lst를 두 부분으로 나누어주고,
# partition 이후 pivot의 인덱스를 리턴받는다
pivot = partition(lst, start, end)
# pivot의 왼쪽 부분 정렬
quicksort(lst, start, pivot - 1)
# pivot의 오른쪽 부분 정렬
quicksort(lst, pivot + 1, end)
# 테스트 1
list1 = [1, 3, 5, 7, 9, 11, 13, 11]
quicksort(list1, 0, len(list1) - 1)
print(list1)
# 테스트 2
list2 = [28, 13, 9, 30, 1, 48, 5, 7, 15]
quicksort(list2, 0, len(list2) - 1)
print(list2)
# 테스트 3
list3 = [2, 5, 6, 7, 1, 2, 4, 7, 10, 11, 4, 15, 13, 1, 6, 4]
quicksort(list3, 0, len(list3) - 1)
print(list3)
728x90
반응형
'[코드잇] > ㄴ알고리즘' 카테고리의 다른 글
[알고리즘] 문제6 - Greedy Algorithm (1) | 2021.07.26 |
---|---|
[알고리즘] 문제5 - Dynamic Programming (0) | 2021.07.26 |
[알고리즘] 문제5 - Divide and Conquer (분할 정복) (0) | 2021.07.25 |
[알고리즘] 문제4 - Brute Force (0) | 2021.06.14 |
[알고리즘] 문제3 - 재귀 함수 (0) | 2021.06.14 |
댓글
250x250
반응형
TAG
- Summer/Winter Coding(~2018)
- 파이썬문법
- 프로그래머스
- 재귀함수
- 월간 코드 챌린지 시즌1
- 코딩테스트
- 컴퓨터개론
- 알고리즘
- 프로그래머스 프로그래머스문제
- 조합
- 월간 코드 챌린지 시즌2
- level1
- 유닉스커맨드
- level2
- 프로그래밍언어
- 프로그래머스코딩테스트
- 프로그래머스문제
- 백준
- 피보나치
- SWiFT
- KAKAO
- 코드잇
- 설치
- 파이썬
- 문법
- 정렬
- GIT
- x만큼간격이있는n개의숫자
- 이진탐색
- 알고리즘문제
최근에 달린 댓글
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
링크
- Total
- Today
- Yesterday