정렬 알고리즘이란?

선택 정렬
- 처리되지 않은 데이터 중에서 가장 작은 데이터를 선택해 맨 앞에 있는 데이터와 바꾸는 것을 반복




'선택 정렬' 소스코드
arr = [7,5,9,0,3,1,6,2,4,8]
for i in range(len(arr)):
min_idx = i
for j in range(i+1,len(arr)):
if arr[min_idx] > arr[j]:
min_idx = j
arr[i], arr[min_idx] = arr[min_idx], arr[i]
print(arr)
'선택 정렬' 시간복잡도

삽입 정렬
- 처리되지 않은 데이터를 하나씩 골라 적절한 위치에 삽입
- 선택정렬에 비해 구현 난이도가 높은 편이지만 일반적으로 더 효율적으로 동작




'삽입 정렬' 소스코드
arr = [7,5,9,0,3,1,6,2,4,8]
for i in range(1,len(arr)):
for j in range(i,0,-1):
if arr[j] < arr[j-1]:
arr[j], arr[j-1] = arr[j-1], arr[j]
else:
break
print(arr)
'삽입 정렬' 시간복잡도

퀵 정렬
- 기준 데이터를 설정하고 그 기준보다 큰 데이터와 작은 데이터의 위치를 바꾸는 방법
- 일반적인 상황에서 가장 많이 사용되는 정렬 알고리즘 중 하나
- 병합 정렬과 더불어 대부분의 프로그래밍 언어의 정렬 라이브러리의 근간이 되는 알고리즘
- 가장 기본적인 퀵 정렬은 첫번째 데이터를 기준 데이터(Pivot)로 설정






'퀵 정렬' 소스코드 1
arr = [5,7,9,0,3,1,6,2,4,8]
def quick_sort(arr,start,end):
if start >= end:
return
pivot = start
left = start + 1
right = end
while (left <= right):
while (left <= end and arr[left] <= arr[pivot]):
left += 1
while (right > start and arr[right] >= arr[pivot]):
right -= 1
if (left > right):
arr[right], arr[pivot] = arr[pivot], arr[right]
else:
arr[left], arr[right] = arr[right], arr[left]
quick_sort(arr,start,right-1)
quick_sort(arr,right+1,end)
quick_sort(arr,0,len(arr)-1)
print(arr)
'퀵 정렬' 소스코드 2
array = [5,7,9,0,3,1,6,2,4,8]
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[0]
tail = arr[1:]
left = [x for x in tail if x <= pivot]
right= [x for x in tail if x > pivot]
return quick_sort(left) + [pivot] + quick_sort(right)
print(quick_sort(array))
'퀵 정렬' 시간복잡도


계수 정렬
- 특정한 조건이 부합할 때만 사용할 수 있지만 빠르게 동작하는 정렬 알고리즘
-> 계수 정렬은 데이터의 크기 범위가 제한되어 정수 형태로 표현할 수 있을 때 사용 가능
- 데이터의 개수가 N, 데이터(양수) 중 최댓값이 K일 때 최약의 경우에도 수행시간 O(N+K)를 보장





'계수 정렬' 소스코드
arr = [7,5,9,0,1,3,6,2,9,1,4,8,0,5,2]
cnt = [0] * (max(arr)+1)
for i in range(len(arr)):
cnt[arr[i]] += 1
for j in range(len(cnt)):
for k in range(cnt[j]):
print(j, end = ' ')
'계수 정렬' 시간 복잡도

정렬 알고리즘 비교

문제 1: 두 배열의 원소 교체




문제 풀이
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]
else:
break
print(sum(a))