O(n^2) 정렬 알고리즘
@ 참고 자료)
- all sample codes from geeksforgeeks
0. 들어가며¶
정렬 알고리즘의 성능을 판별하는 잣대!
보조 공간 (Auxiliary Space)
- 배열을 저장하는 메모리 외의 정렬을 위해 필요한 추가 메모리
시간 복잡도 (Time Complexity)
comp
연산의 횟수swap
연산의 횟수
1. 버블 정렬 Bubble Sort¶
1. Python Code¶
Bubble Sort!
# Python program for implementation of Bubble Sort
def bubbleSort(arr):
n = len(arr)
# Traverse through all array elements
for i in range(n):
# Last i elements are already in place
for j in range(0, n-i-1):
# traverse the array from 0 to n-i-1
# Swap if the element found is greater
# than the next element
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
arr = [5, 1, 4, 2, 8]
bubbleSort(arr)
print("Sorted array is:")
for i in range(len(arr)):
print("%d" % arr[i], end=" ")
Sorted array is:
1 2 4 5 8
2. 실행 흐름¶
다음 순서로 비교와 스왑을 진행한다.
- arr[0],arr[1] -> arr[1], arr[2] -> ...........-> arr[n-3],arr[n-2] -> arr[n-2], arr[n-1]
- arr[0],arr[1] -> arr[1], arr[2] -> ............-> arr[n-3],arr[n-2]
- ....
- arr[0],arr[1] -> arr[1], arr[2]
- arr[0],arr[1]
3. 특징¶
- 버블 정렬은 가장 기초적인 정렬 알고리즘 이다.
- Stable Sort
- 시간 복잡도 - O(n2), 보조 메모리 - O(1) (
temp
저장용 하나) - 최선의 경우 - 배열이 모두 정렬 된 경우
- swap 을 한번도 진행하지 않지만 그경우에도 항상 O(n2) 타임의 비교연산이 필요하다.
- 최악의 경우 - 배열이 역순으로 정렬 된 경우
- swap, comp 연산 모두 O(n2) 타임이 필요하다.
2. 선택 정렬 (Selection Sort)¶
1. Python Code¶
Selection Sort!
# Python program for implementation of Selection
# Sort
import sys
A = [64, 25, 12, 22, 11]
# Traverse through all array elements
for i in range(len(A)):
# Find the minimum element in remaining
# unsorted array
min_idx = i
for j in range(i+1, len(A)):
if A[min_idx] > A[j]:
min_idx = j
# Swap the found minimum element with
# the first element
A[i], A[min_idx] = A[min_idx], A[i]
# Driver code to test above
print ("Sorted array")
for i in range(len(A)):
print("%d" %A[i],end=" ")
Sorted array
11 12 22 25 64
2. 실행 흐름¶
- i
최소 값 찾기
Comp n-i-1 회 -> Swap - 무조건 발생 0
arr[0], arr[1], .... arr[n-2], arr[n-1] -> swap(arr[0], arr[min_idx0~n-1])1
arr[1], .... arr[n-2], arr[n-1] -> swap(arr[1], arr[min_idx1~n-1])n-2
arr[n-2], arr[n-1] -> swap(arr[n-2], arr[min_idxn-2~n-1])n-1
arr[n-1] -> swap(arr[n-1], arr[min_idxn-1~n-1]) // 생략
3. 특징¶
- 정렬의 형태에 관계없이 최선의 경우, 최악의 경우 성능이 일정하다.
- Stable Sort
- 시간 복잡도 - comp -
O(n^2)
, swap - O(n), 보조 공간 -O(1)
3. 삽입 정렬 (Insertion sort)¶
1. Python Code¶
Selection Sort!
# Python program for implementation of Insertion Sort
# Function to do insertion sort
def insertionSort(arr):
# Traverse through 1 to len(arr)
for i in range(1, len(arr)):
key = arr[i]
# Move elements of arr[0..i-1], that are
# greater than key, to one position ahead
# of their current position
j = i-1
while j >= 0 and key < arr[j] :
arr[j + 1] = arr[j]
j -= 1
arr[j + 1] = key
# Driver code to test above
arr = [12, 11, 13, 5, 6]
insertionSort(arr)
print ("Sorted array")
for i in range(len(arr)):
print ("% d" % arr[i])
# This code is contributed by Mohit Kumra
Sorted array
5
6
11
12
13
2. 실행 흐름¶
key 를 고른다 -> 적당한 위치에 삽입한다.
- i -> key -> comp (i-1 ~ 더 작을 때 까지)/ comp 하는 동시에 뒤로 미는 swap 도 수행
- 1 -> arr[1] -> j = 0 done
- 2 -> arr[2] -> j = 1/ key 와 arr[j] 비교 -> key 가 더 작으면 계속 arr[j+1] 과 [j] 변경
...
- n -> arr[n] -> 이미 정렬된 arr[0-n-1] 에서 앞으로 이동하며 arr[n] 의 위치를 잡아준다
3. 특징¶
- 개수가 적은 경우, 이미 어느정도 정렬 된 경우 매우 강력하다. 역순으로 정렬된 최악의 경우 성능이 매우 안 좋다.
- key 를 삽입할 위치를 찾는 과정에서 앞 배열이 이미 정렬 되었다는 점을 이용해 비교 연산의 횟수를 O(nlogn) 수준으로 낮추는
이진 삽입 정렬
이라는 변형이 존재한다. - Time Complexity: O(N2) , Auxiliary Space: O(1)
Last update:
February 26, 2023
Created: February 1, 2023
Created: February 1, 2023