나동빈님의 책과 유튜브 강의인 '이것이 코딩 테스트다'를 바탕으로 스스로 공부한 내용을 정리한 글입니다.
참고한 영상의 링크는 아래와 같습니다.
이것이 코딩테스트다 - 정렬 알고리즘
array = [7,5,9,0,3,1,6,2,4,8]
for i in range(len(array)):
min_index = i
for min_index in range(len(array)):
if array[i] < array[min_index]:
array[min_index], array[i] = array[i], array[min_index]
print(array)
선택정렬의 시간복잡도
- 매번 정렬되지 않은 N번만큼의 가장 작은 수를 앞으로 보내야 한다.
- N, (N-1), (N-2), ... 2
array = [7,5,9,0,3,1,6,2,4,8]
for i in range(1, len(array)):
for j in range(i,0,-1): # i는 index를 하나씩 줄이면서 첫번째 원소까지
if array[j] < array[j-1]:
array[j] , array[j-1] = array[j-1], array[j]
else: # 자기 자신보다 작은 원소를 만나면 멈춤 (i번째 이전까지는 모두 정렬이 되어있다고 가정하기 때문)
break
print(array)
삽입정렬의 시간복잡도
- 반복문을 2번 돌아야함으로 의 시간복잡도이나
- 현재 리스트가 거의 정렬되어있을 경우 매우 빠르게 동작함.
array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]
def quick_sort(array, start, end):
if start >= end:
return
pivot = start
left = start + 1
right = end
# pivot을 기준으로 left, right을 탐색할 예정인데 엇갈리는 순간 pivot을 기준으로
# 정렬이 되어있다는 의미임으로 while문 탈출.
while (left <= right):
# 좌측의 데이터에 대해서, puvot보다 큰 데이터를 찾기 때문에
# piovot보다 같거나 작으면 한칸씩 이동
while left <= end and array[pivot] >= array[left]:
left += 1
# 우측의 데이터에 대해서, puvot보다 작은 데이터를 찾기 때문에
# piovot보다 같거나 크면 한칸씩 이동
while start < right and array[pivot] <= array[right]:
right -= 1
# pivot을 기준으로 left에 있는 데이터보다 right에 있는 데이터가 더 큰 상황
# index 상으로도 left > right인 상황.
# 이 말은 곧 pivot이 제대로 동작하고 있음을 의미하니, pivot을 right
# (좌측의 최우단)에 배치시킨다.
if left > right:
array[pivot], array[right] = array[right], array[pivot]
# pivot을 기준으로 left에 있는 데이터보다 right에 있는 데이터가 더 큰 상황
# 그러나 index 상으로 left < right인 상황 따하서 둘의 데이터 순서를 바꾸어 준다.
else:
array[left], array[right] = array[right], array[left]
quick_sort(array, start, right - 1)
quick_sort(array, right + 1, end)
quick_sort(array, 0, len(array) - 1)
print(array)
개인적으로 이해하기 어려웠던 알고리즘이라 코드를 짜면서 들었던 생각들이다.
내가 했던 고민들을 보다 더 직관적으로 파이썬으로 풀어서 반영해준 코드는 아래와 같다.
array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8,7,7]
def quick_sort(array):
print(array)
if len(array) <= 1:
return array
pivot = array[0]
tail = array[1:]
left_side = [x for x in tail if x<=pivot]
right_side = [x for x in tail if x>pivot]
return quick_sort(left_side) + [pivot] + quick_sort(right_side)
print(quick_sort(array))
array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8, 7, 7]
count = [0] * (max(array) - min(array) + 1) # array의 max, min값을 알고 있다고 가정
for i in array: # N회 반복
count[i] += 1
for idx, cnt in enumerate(count): # K회 반복
for _ in range(cnt): # N회 반복
print(idx, end=" ")
n, k = map(int, input().split())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
a.sort()
b.sort(reverse=True)
for i in range(k):
if a[i] < b[i]:
a[i], b[i] = b[i], a[i]
print(sum(a))