선택, 삽입 정렬
특정값 index를 찾는 알고리즘
- find_index() : List 안에 있는 값을 찾아서 해당 위치를 반환해주는 함수
def find_index(list_, var):
res_index = -1
for i in range(len(list_)):
if list_[i] == var:
res_index = i
break
return res_index
data = [24, 10, 3, 8, 33, 27, 46]
print(find_index(data, 8))
Selection Sort
- 시간복잡도는 Worst - O(N^2), Avgerage - O(N^2), Best - O(N^2)
- for문을 돌며 가장 작은 값을 찾아 0번째부터 바꿔나간다.
- for문을 2번 돌아야 한다.
- i==0부터 list의 길이만큼인 i==n-1까지
- 그리고 각 for문마다 j==i+1(i 다음번과 비교한다)부터 i==n-1까지 비교하며 최소값을 찾는다.
- i번째와 최솟값의 위치를 바꾼다.
def select(list_):
# list_의 0번째부터 n-1번째까지 루프를 돌며 최소값찾음
for i in range(len(list_)):
min = list_[i]
idx = i
# i번째 작은 값 찾기
for j in range(i+1, len(list_)):
if min > list_[j]:
min = list_[j]
idx = j
# i번째 작은 값을 i번째로 이동
temp = list_[i]
list_[i] = min
list_[idx] = temp
# 정렬된 list_를 return
return list_
data = [5,3,2,1,4]
print(select(data))
그림과 같이 주황색 박스는 i번째 박스이다. 0번째부터 i번째 작은 값과 자리를 바꿔가며 정렬한다.
Insertion Sort
- 시간복잡도는 Worst - O(N^2), Average - O(N^2), Best - O(N)
- 특정값이 들어갈 위치를 찾아 삽입하여 Insertion Sort를 구현
- select_idx(list_, var)함수를 통해 var이 list_안에 몇 번째 index에 들어가야 하는지 찾는다.
- insert(list_) 함수는 list_안에 있는 요소를 앞에서부터 하나씩 꺼낸다.
- 그리고 새로운 list인 result에 추가해나간다.
- 추가해 나갈 때, select_idx(list_, var)함수를 이용해 몇 번째 index에 넣어야 할지를 계산한다.
def select_idx(list_, var):
if len(list_) == 0:
return 0
# 0번째부터 n-1번째까지 돌며 들어갈 자리 탐색
for i in range(len(list_)):
# var값보다 i번째 리스트값이 크면 i return
if list_[i] > var:
return i
return len(list_)
def insert(list_):
result = []
while list_:
tdata = list_.pop(0)
idx = select_idx(result, tdata)
print(idx,tdata)
result.insert(idx, tdata)
print('result = ',result)
return result
data = [5,3,2,1,4]
result = insert(data)
print(result)
Insertion Sort - 2
- i는 1번째부터 n-1번째까지 돌며 순서대로 자기 자리를 찾아간다.
- j는 0번째부터 i전까지 돌며 i의 값과 비교한다.
- i가 j값보다 작을 경우 해당 위치에 삽입한다.
def f_insert(list_):
result = []
for i in range(1, len(list_)):
for j in range(0, i):
if list_[i] < list_[j]:
var = list_.pop(i)
list_.insert(j, var)
return list_
data = [5,3,2,1,4]
result = f_insert(data)
print(result)
'알고리즘' 카테고리의 다른 글
[이진탐색] Binary Search - Python (2) | 2020.12.25 |
---|---|
[버블 정렬] Bubble Sort - Python (0) | 2020.12.25 |
[프로그래머스] 정렬 - K번째 수 (0) | 2020.12.24 |
[퀵 정렬] Quick Sort - Python (0) | 2020.12.24 |
[병합 정렬] Merge Sort - Python (0) | 2020.12.24 |