프로그래밍/자료구조
정렬 / 탐색
YERIEL
2020. 7. 27. 21:06
선택정렬
: n >= 1 개의 서로 다른 정수의 집합을 정렬
"정렬되지 않은 정수들 중에서 가장 작은 값을 찾아서 정렬된 리스트 다음 자리에 놓는다."
# 선택 정렬
def SelectionSort(a, n): # n개의 정수 a[0]부터 a[n-1]까지 비감소 순으로 정렬
for i in range(n): # a[i]와 a[n-1] 사이에 가장 작은 정수를 찾음
for j in range(i, n):
if a[i] > a[j]:
temp = a[i]
a[i] = a[j]
a[j] = temp
return a
list = list()
num = int(input()) # 리스트 크기 입력
for i in range(num):
new = int(input())
list.append(new)
print(SelectionSort(list, num))
이원 탐색
: 이미 정렬된 배열 a[0]...a[n-1]에서 x = a[j]인 j를 반환
# 입력값 : 리스트, key
def BinarySearch(list, key):
left = 0
right = len(list) - 1
while(left <= right):
middle = int((left + right) / 2)
if key < list[middle]:
right = middle - 1
elif key > list[middle]:
left = middle + 1
elif key == list[middle]:
return middle
return -1
def SelectionSort(a, n):
for i in range(n):
for j in range(i, n):
if a[i] > a[j]:
temp = a[i]
a[i] = a[j]
a[j] = temp
return a
n = int(input('배열 크기 : '))
list = list()
for i in range(n):
list.append(int(input()))
key = int(input('찾고자 하는 키 : '))
list = SelectionSort(list, n) # 정렬
print(BinarySearch(list, key))
순환 알고리즘
: 수행이 완료되기 전에 자기 자신을 다시 호출
- 직접 순환 (direct recursion) : 함수가 그 수행이 완료되기 전에 자기 자신을 다시 호출
- 간접 순환 (indirect recursion) 호출 함수를 다시 호출하게 되어 있느 다른 함수를 호출
순환 이원 탐색
: 재귀호출을 통한 이원 탐색
# 입력값 : 리스트, key
def RotateBinarySearch(list, key, left, right):
middle = int((left + right)/2)
if(left <= right):
if key < list[middle]:
return RotateBinarySearch(list, key, left, middle - 1)
elif key > list[middle]:
return RotateBinarySearch(list, key, middle + 1, right)
elif key == list[middle]:
return middle
else:
return -1
def SelectionSort(a, n):
for i in range(n):
for j in range(i, n):
if a[i] > a[j]:
temp = a[i]
a[i] = a[j]
a[j] = temp
return a
n = int(input('배열 크기 : '))
list = list()
for i in range(n):
list.append(int(input()))
key = int(input('찾고자 하는 키 : '))
list = SelectionSort(list, n) # 정렬
left = 0
right = n - 1
print(RotateBinarySearch(list, key, left, right))