알고리즘/알고리즘 종류
[알고리즘 종류] 정렬 알고리즘
엉아_
2021. 8. 13. 20:26
728x90
1) 버블 정렬
- 첫 번째 원소부터 인접한 원소끼리 계속 자리를 교환하면서 맨 마지막 자리까지 이동한다.
- 한 단계가 끝나면 가장 큰 원소가 마지막 자리로 정렬된다.
- 시간 복잡도 : O(n²)
def bubble_sort(a): # 정렬할 List
for i in range(len(a)-1, 0, -1):
for j in range(0, i):
if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]
2) 카운팅 정렬
- 항목들의 순서를 결정하기 위해 집합에 각 항목이 몇 개씩 있는지 세는 작업을 하여, 선형시간에 정렬
- 정수나 정수로 표현할 수 있는 자료에 대해서만 적용 가능
- 시간 복잡도 : O(n + k) : n은 리스트 길이, k는 정수의 최대값
def counting_sort(A, B, k):
#A : 입력 배열(1 to k), B : 정렬된 배열, C : 카운트 배열
C = [0 for _ in range(K)]
for i in range(0, len(B)):
C[A[i]] += 1
for i in range(1, len(C)):
C[i] += C[i-1]
for i in range(len(B)-1, -1, -1):
B[C[A[i]]-1] = A[i]
C[A[i]] -= 1
3) 선택 정렬
- 주어진 자료들 중 가장 작은 값의 원소부터 차례대로 선택하여 위치를 교환하는 방식
- 리스트의 최솟값을 찾고 그 값을 리스트의 맨 앞에 위치한 값과 교환하는 과정 반복
- 시간 복잡도 : O(n²)
def selcetion_sort(a):
for i in range(0, len(a)-1):
min = i
for j in range(i+1,len(a)): # 이미 정렬된 값은 빼주기 위해 시작값이 i+1
if a[min] > a[j]:
min = j
a[i], a[min] = a[min], a[i]
4) 퀵정렬
- 퀵 정렬은 분할 정복 방법을 통해 리스트를 정렬
- 리스트 가운데서 하나의 원소를 고른다. 이렇게 고른 원소를 피벗이라고 한다.
- 피벗 앞에는 피벗보다 값이 작은 모든 원소들이 오고, 피벗 뒤에는 피벗보다 값이 큰 모든 원소들이 오도록 피벗을 기준으로 리스트를 둘로 나눈다. 이렇게 리스트를 둘로 나누는 것을 분할이라고 한다. 분할을 마친 뒤에 피벗은 더 이상 움직이지 않는다.
- 분할된 두 개의 작은 리스트에 대해 재귀적으로 이 과정을 반복한다. 재귀는 리스트의 크기가 0이나 1이 될 때까지 반복된다.
- 재귀 호출이 한번 진행될 때마다 최소한 하나의 원소는 최종적으로 위치가 정해지므로, 이 알고리즘은 반드시 끝난다는 것을 보장할 수 있다.
- 시간복잡도: O(nlogn) (최악의 경우 O(n²))
def quicksort(x):
if len(x) <= 1:
return x
pivot = x[len(x) // 2]
less = []
more = []
equal = []
for a in x:
if a < pivot:
less.append(a)
elif a > pivot:
more.append(a)
else:
equal.append(a)
return quicksort(less) + equal + quicksort(more)
5) 팀정렬
- Insertion sort와 Merge sort를 결합하여 만든 정렬
- 시간복잡도: O(nlogn) (최선의 경우 O(n))
- sorted()와 list.sort()에 사용된 정렬 알고리즘
- 현업에서 가장 많이 사용되는 정렬법
코드는 다음에,,,