&
: 주소 연산자*
: 참조 연산자public func selectionSort<Element>(_ array: inout [Element]) where Element: Comparable {
guard array.count >= 2 else { return }
// 비교 X
for cur in 0..<array.count-1 {
// cur 번째 가장 작은 수 구하기
var lowest = cur
for other in (cur+1)..<array.count {
if array[lowest] > array[other] {
lowest = other
}
}
// 현 시점 배열 내에서 가장 "작은" 값이 담긴 인덱스 lowest
if lowest != cur {
array.swapAt(lowest, cur)
}
}
}
public func binarySearchIterative<Element>(_ array: [Element], _ searchedItem: Element) -> Int where Element: Comparable {
var left = 0
var right = array.count-1
while left < right {
let middle = (left + right) / 2
if searchedItem == array[middle] {
return middle
} else if searchedItem > array[middle] {
left = middle + 1
} else {
right = middle - 1
}
}
return -1
}
var array = [1, 2, 3, 4, 5, 100, -1, 20, 30]
let wrongIdx = binarySearchIterative(array, 30)
// -1 -> 정렬되지 않은 배열을 파라미터로 전달
array.sort()
// [-1, 1, 2, 3, 4, 5, 20, 30, 100] -> 정렬된 배열을 파라미터로 전달
let rightIdx = binarySearchIterative(array, 30)
print(rightIdx)
// 7
public func binarySeachRecursive<Element>(_ array: [Element], _ searchItem: Element, _ left: Int, _ right: Int) where Element: Comparable {
if left <= right {
let middle = (left + right) / 2
if searchItem == array[middle] {
idx = middle
} else if searchItem > array[middle] {
binarySeachRecursive(array, searchItem, middle + 1, right)
} else {
binarySeachRecursive(array, searchItem, left, middle - 1)
}
}
}
var idx = -1
var array = [30, 2, 3, 4, 5, 100, -1, 20, 1]
binarySeachRecursive(array, 30, 0, array.count-1)
// -1 -> 정렬되지 않은 배열을 파라미터로 전달
array.sort()
// [-1, 1, 2, 3, 4, 5, 20, 30, 100] -> 정렬된 배열을 파라미터로 전달
binarySeachRecursive(array, 30, 0, array.count-1)
// 7
public func permutatinRecursive<Element>(_ array: [Element]) {
if targetArray.count == array.count {
print(array)
guard let array = array as? [Int] else { return }
resultArray.append(array)
return
}
for idx in 0..<targetArray.count {
if !checked[idx] {
checked[idx] = true
permutatinRecursive(array + [targetArray[idx]])
checked[idx] = false
}
}
}
var targetArray = [1, 2, 3]
var checked = Array(repeating: false, count: targetArray.count)
var resultArray = [[Int]]()
permutatinRecursive([])
// [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
데이터 타입을 추상적으로 만들어야 한다. 파이썬, 자바 등 특정 언어로부터 독립적으로 기능하도록(
implementation-independent
)!
일반적으로 공간 복잡도는 에 따라서 결정된다!
특정 알고리즘의 퍼포먼스를 측정하는 건 쉽지 않기 때문에 간략화된 방식이 필요하다!
빅-오 표현 방법은
upper bound
임에 주의하자!
이 밖에도
lower bound
인 빅-오메가,lower and upper bound
인 빅-세타 표기 방법이 존재하지만, 빅-오가 가장 전반적으로 두루 사용되는 시간 복잡도 표기 방법이다!
n이 선형적으로 증가하지만 연산 필요 시간은 알고리즘의 효율성에 따라서 엄청난 격차가 벌어지기 때문에, 효율적인 알고리즘을 짜는 게 연산 시간을 줄이는 데 필수적이다!