Search

정렬(Sort)

대분류
CS
소분류
알고리즘
유형
알고리즘
부유형
선택
삽입
계수
주요 레퍼런스
https://velog.io/@whattsup_kim/%EA%B8%B0%EC%B4%88-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%9D%B4%EB%A1%A0
최종 편집 일시
2024/10/27 15:34
생성 일시
2024/07/11 02:09
13 more properties

정렬

정렬 : 데이터를 특정 기준에 따라 순서대로 나열하는 것
정렬 알고리즘
평균 시간 복잡도
공간 복잡도
특징
선택 정렬
O(N2)
O(N)
아이디어가 매우 간단함 (,,)
삽입 정렬
O(N2)
O(N)
데이터가 거의 정렬되어 있을 땐 가장 빠름
퀵 정렬
O(NlogN)
O(N)
대부분의 경우에 가장 접합하며, 충분히 빠름
계수 정렬
O(N+최댓값)
O(N+최댓값)
데이터의 크기가 한정되어 있는 경우에만 사용이 가능하지만 매우 빠르게 동작함

선택 정렬

처리 되지 않은 데이터 중 가장 작은 데이터를 선택해 맨 앞에 있는 데이터와 바꾸는 것
탐색 범위는 반복할 때마다 1개씩 감소
마지막 데이터는 제외
앞에 있는 애로 뒤에 있는 애랑 비교
구현
array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8] for i in range(len(array)): min_index = i for j in range(i + 1, len(array)): if array[min_index] > array[j]: min_index = j array[i], array[min_index] = array[min_index], array[i] # 스왑 print(array)
Python
복사

삽입(Insert) 정렬

처리되지 않은 데이터를 하나씩 골라 적절한 위치에 삽입
선택 정렬에 비해 구현 난이도가 높지만, 일반적으로 더 효율적으로 동작
현재 리스트의 데이터가 거의 정렬되어 있는 상태일 때 매우 빠르게 동작
뒤에 있는 애로 앞에 있는 애랑 비교
구현
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): if array[j] < array[j - 1]: array[j], array[j - 1] = array[j - 1], array[j] else: break print(array)
Python
복사

퀵(Quick) 정렬

기준 데이터를 설정하고 그 기준보다 큰 데이터와 작은 데이터의 위치를 바꾸는 방법
일반적으로 가장 많이 사용
정렬이 안된 배열, 분할이 잘 되는 경우 빠름
동작
첫 번째 데이터를 기준 데이터(Pivot)로 지정
왼쪽으로부터 pivot보다 큰 값을 찾고, 오른쪽으로부터 pivot보다 작은 값을 찾아서 스왑
위치가 엇갈리는 경우 pivot과 왼쪽 데이터(오른쪽에서 오던)의 위치 서로 변경
구현
array = [5,7,9,0,3,1,6,2,4,8] def quick_sort(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))
Python
복사

계수 정렬

특정 조건이 부합할 때 매우 빠르게 동작하는 정렬 알고리즘
데이터의 크기 범위가 제한되어 정수 형태로 표현 가능할 때 사용
데이터의 개수가 N, 데이터(양수) 중 최댓값이 K일 때 최악의 경우에도 수행시간 O(N+K)를 보장
계수 정렬은 동일한 값을 가지는 데이터가 여러 개 등장할 때 효과적
0과 999,999의 2개만 존재하는 리스트를 정렬한다면 비효율적
동작
origin, indexCount, sorted 리스트를 만들고
indexCount[origin 리스트의 값]에 값의 개수만큼 카운트를 올려준다.
indexCount의 값들을 1부터 마지막 값까지 바로 이전 값과 계속 더하여 누적합으로 만든다.
indexCount을 바탕으로 sorted 정렬
구현
array = [5,7,9,0,3,1,6,2,4,8] count = [0] * (max(array) + 1) # 0부터 9까지 존재하기 때문 for i in range(len(array): count[array[i]] +=1 # 각 데이터에 해당하는 인덱스의 값 증가 for i in range(len(count)): #리스트에 정렬된 내용 확인합니다. for j in range((count[i]): print(i, end=' ') #띄어쓰기 구분
Python
복사