Swift) Sort 구현(2)

1 minute read

Quick / Merge Sort

새로운 배열에 저장하기 때문에 inout 키워드를 사용하지 않는다.

Quick Sort

  • filter 함수 : 각 항목들을 비교하여 새로운 배열을 반환.

배열의 맨 앞의 수를 pivot 으로 설정해서 진행.

func quickSort(_ array: [Int]) -> [Int] {
    guard let first = array.first, array.count > 1 else { return array }
 
    let pivot = first
    let left = array.filter { $0 < pivot }
    let right = array.filter { $0 > pivot }
    
    return quickSort(left) + [pivot] + quickSort(right)
}

Merge Sort

배열의 갯수가 1개이하(재귀 탈출 조건)가 될 때까지 배열을 반으로 쪼갠 후 재귀 탈출하면 합병 정렬하면서 리턴해준다.

func mergeSort(_ array: [Int]) -> [Int] {
//재귀 탈출 조건.
    if array.count <= 1 { return array }
    let center = array.count/2
    let left = Array(array[0..<center])
    let right = Array(array[center..<array.count])
    
    return merge(mergeSort(left), mergeSort(right))
}

//합병
func merge(_ left: [Int], _ right: [Int]) -> [Int] {
    var left = left
    var right = right
    var result: [Int] = []
    
    //한쪽 배열이 다 비워질 때까지.
    while !left.isEmpty && !right.isEmpty {
        //왼쪽이 가장 작기 때문.
        if left[0] < right[0] {
            result.append(left.removeFirst())
        } else {
            result.append(right.removeFirst())
        }
    }
    
    //왼쪽 배열의 요소가 남은 경우
    if !left.isEmpty {
        result.append(contentsOf: left)
    }
    if !right.isEmpty {
        result.append(contentsOf: right)
    }
    
    return result
}
}

출처

출처ㅣhttps://babbab2.tistory.com/101?category=908012

출처ㅣhttps://babbab2.tistory.com/102?category=908012