# 정렬
[23, 75, 34, 3, 83, 32, 5, 17, 39, 43, 14]
찾으려는 값이 34이면
23과 34를 비교하고 아니여서 넘어가고
75와 34를 비교하고 아니여서 넘어가고
34와 34를 비교해서 정답.
최선의 경우
찾으려는 값이 23일때 1만큼 걸린다. O(1)만큼 걸린다.
최악의 경우
찾으려는 값이 1일때, 리스트에 없음으로 리스트의 길이인 11만큼 걸린다. O(N)만큼 걸린다.
def linear_search(element, some_list):
for i in range(len(some_list)):
if element == some_list[i]:
return i
print(linear_search(2, [2, 3, 5, 7, 11]))
print(linear_search(0, [2, 3, 5, 7, 11]))
print(linear_search(5, [2, 3, 5, 7, 11]))
print(linear_search(3, [2, 3, 5, 7, 11]))
print(linear_search(11, [2, 3, 5, 7, 11]))
# 정렬
[1, 5, 7, 8, 10, 13, 17, 19, 23, 24, 28, 39]
찾으려는 값이 7이면
리스트의 중간값인 13과 7을 비교하고 아니여서 넘어가고, 리스트의 범위를 [1, 5, 7, 8, 10
로 줄인다.
리스트의 중간값인 7과 7을 비교해서 정답
최선의 경우
찾으려는 값이 13일때 1만큼 걸린다. O(1)만큼 걸린다.
최악의 경우
찾으려는 값이 0일때, 리스트에 없음으로 리스트 길이가 N이고 찾으려는 값을 k로 가정하면,
처음 반절로 나누면 (1/2) x N
두번 나누면 (1/2) x (1/2) x N
k번 나누면 (1/2)^k x N
인데
최악의 경우 남는 자료가 1개이기 떄문에
(1/2)^k x N = 1
임으로
양변에 2^K
를 곱해주면
N = 2^K
임으로
k = log2(N)
이다.
즉 O(log(N)) 만큼 걸린다.
def binary_search(element, some_list):
start_index, end_index = 0, len(some_list) - 1
while start_index <= end_index:
mid_index = (start_index + end_index) // 2
if some_list[mid_index] == element:
return mid_index
elif some_list[mid_index] < element:
start_index = mid_index + 1
elif some_list[mid_index] > element:
end_index = mid_index - 1
return None
print(binary_search(2, [2, 3, 5, 7, 11]))
print(binary_search(0, [2, 3, 5, 7, 11]))
print(binary_search(5, [2, 3, 5, 7, 11]))
print(binary_search(3, [2, 3, 5, 7, 11]))
print(binary_search(11, [2, 3, 5, 7, 11]))
# 정렬
[5, 1, 3, 4, 9, 7]
오름차순으로 정렬시키면
[5, 1, 3, 4, 9, 7]
리스트 중에 가장 작은 값인 1을 가장 앞과 바꾼다
-> [1, 5, 3, 4, 9, 7]
5, 3, 4, 9, 7
에서 가장 작은 값인 3과 가장 앞과 바꾼다
-> [1, 3, 5, 4, 9, 7]
5, 4, 9, 7
에서 가장 작은 값인 4와 가장 앞과 바꾼다
-> [1, 3, 4, 5, 9, 7]
5, 9, 7
에서 가장 작은 값인 5가 가장 앞에 있으므로 넘어간다
9, 7
에서 가장 작은 값인 7을 가장 앞과 바꾼다
-> [1, 3, 4, 5, 7, 9]
# 정렬
[5, 1, 3, 4, 9, 7]
오름차순으로 정렬시키면
5, 1
에서 1이 5보다 작음으로 위치를 바꾼다.
-> [1, 5, 3, 4, 9, 7]
1, 5, 3
에서 3이 5보다 작음으로 위치를 바꾼다. 3이 1보단 큼으로 멈춘다.
-> [1, 3, 5, 4, 9, 7]
1, 3, 5, 4
에서 4가 5보다 작음으로 위치를 바꾼다. 4가 3보단 큼으로 멈춘다.
-> [1, 3, 4, 5, 9, 7]
1, 3, 4, 5, 9
에서 9가 제일 큼으로 그대로다.
-> [1, 3, 4, 5, 9, 7]
1, 3, 4, 5, 9, 7
에서 7이 9보다 작음으로 위치를 바꾼다. 7이 5보단 큼으로 멈춘다.
-> [1, 3, 4, 5, 7, 9]
그 외에도 퀵정렬, 힙정렬 등 많은 정렬방법이 있다. 아래 링크를 통해 상황별 퍼포먼스를 비교할 수 있다. 상황에 따라 알맞은 정렬알고리즘을 사용하는게 중요하다.
알고리즘별 퍼포먼스 비교