ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SelectionSort with Swift
    DataStructure + Algorithm/Basic Theories 2021. 10. 8. 19:44

    Description

    Selection Sort 는, 배열 차례대로 하나하나 비교해가며 가장 작은 값을 찾은 후,  가장 낮은 인덱스에 있는 수와 바꾸는 방식을 반복하여 정렬을 진행합니다. 아래는 정렬할 array 의 예시입니다. (Bubble Sort 의 경우와 같은 array 를 대상으로 정렬을 진행하겠습니다. 

    [4, 3, 5, 2, 1]

    1.   먼저 4 ( 0번째 index ) 을 기준으로 한 후 3와 비교합니다. 기준이 아닌 수가 기준보다 작으므로 3 를 기준으로 삼습니다. 

    2.   이제, 새로운 기준 3 과 5 를 비교합니다. 기준이 더 작으므로 다음 수로 넘어갑니다.

    3.   3과 2 를 비교합니다. 2 가 기준보다 작으므로, 2 를 새로운 기준으로 삼습니다.

    4.   2 와 1 을 비교합니다. 1 이 기준보다 작으므로, 1 을 새로운 기준으로 삼습니다.

     

    이제 더 비교할 수가 없으므로, 0번 index 와 지금까지 가장 작은 값 1 이 있는 4 번 index 값들을 서로 바꿔줍니다. 

     

    // [4, 3, 5, 2, 1]
       [1, 3, 5, 2, 4]

    1이 고정되었습니다. 행렬의 모든 수 중 가장 작은 값을 0 번 index 에 위치시켰으므로, 다음 단계는 1번 index 부터 시작합니다.

    1.    1 번 index 에 있는 수 3 을 기준으로 삼습니다.   기준 3 과 5 를 비교합니다. 기준이 더 작으므로 다음 수로 넘어갑니다.

    2.    기준 3과 2 를 비교합니다. 2 가 기준보다 작으므로, 2 를 새로운 기준으로 합니다.

    3.    기준 2 와 4 를 비교합니다. 기준이 더 작고, 더 비교할 수가 없으므로 과정을 종료합니다.

    // [4, 3, 5, 2, 1]
    // [1, 3, 5, 2, 4]
    [1, 2, 5, 3, 4]

    1과 2 가 고정되었습니다. 다음으로 2번 index 5 를 기준으로 삼고 비교를 시작합니다.

    1.    5와 3 을 비교합니다. 3 이 기준보다 작으므로 3 을 새로운 기준으로 삼습니다. 

    2.   3 과 4 를 비교합니다. 기준이 더 작고, 더 비교할 수가 없으므로 과정을 종료합니다.

    // [4, 3, 5, 2, 1]
    // [1, 3, 5, 2, 4]
    // [1, 2, 5, 3, 4]
     [1, 2, 3, 5, 4]

    이제 3번 index 에 있는 5 를 기준으로 삼고 비교를 시작합니다. 

    1.    5 와 4 를 비교합니다. 4 가 기준보다 작으므로 4를 새로운 기준으로 삼습니다. 더 비교할 수가 없으므로 과정을 종료합니다. 

    // [4, 3, 5, 2, 1]
    // [1, 3, 5, 2, 4]
    // [1, 2, 5, 3, 4]
    // [1, 2, 3, 5, 4]
    [1, 2, 3, 4, 5]

    모든 과정이 종료되었습니다 ! Bubble Sort 와 마찬가지로, 비교하는 횟수는 행렬에 5개의 elements 가 있을 때각 단계별로 4, 3, 2, 1 번의 비교가 필요했습니다. 따라서, n 개의 elements 를 갖는 행렬의 경우 (n)(n-1) / 2 번의 과정이 필요합니다. (Bubble Sort 와 동일)

     

     

    Implementation

     

     

    SelectionSort 를 For statement 을 사용하여 만들어보았습니다.

    func selectionSortWithFor(array: [Int]) -> [Int] {
        var pivotIndex = 0
        var arr = array
    
        for i in 0 ..< arr.count - 1 {
            pivotIndex = i
            for j in i ..< arr.count - 1 {
                if (arr[pivotIndex] > arr[j+1]) {
                    pivotIndex = j
                }
            }
            arr.swapAt(i, pivotIndex)
        }
        return arr
    }

    위 코드에서, i index Loop 가 시작할 때, pivotIndex = i 로 설정합니다. pivotIndex 는 위 설명에서, 기준이 되는 값이 존재하는 index 입니다. 행렬 [4, 3, 5, 2, 1] 을 놓고 보았을 때, arr.count == 5 이므로, i 는 0 ... 3 의 값을 갖습니다. 

    또한, i Loop 내부에 j Loop 가 있고, j 의 값은 i ... 3 입니다. if statement 에서 pivotIndex, (j+1) 번째 index 둘을 비교합니다. 따라서 (j+1) 은   (i+1) ... 4 의 값을 가집니다. if statement 내에서 값을 비교한 후, 더 작은 값을 가진 index 가 pivotIndex 가 됩니다.   

     

    j Loop 가 끝나면 pivotIndex 에 행렬 중 가장 작은 값을 가진 수의 index 가 저장되었다고 말할 수 있고, 따라서 i 번째 index 와 pivotIndex 를 서로 바꿔줍니다. 

    그 후 pivotIndex 를 새로운 index ( 증가한 i ) 값으로 설정하고, 비교를 계속합니다. 

     

     

     

    각 단계별 실행 결과 및 실행 횟수를 다음 코드를 통해 확인할 수 있었습니다. 

    let IntArray = [4, 3, 5, 2, 1]
    print("\(IntArray)\n")
    
    func selectionSort(array: [Int]) -> [Int] {
        var pivotIndex = 0
        var arr = array
        var count = 0
        // arr.count - 1 = 4, i : 0 ~ 3 ok  . j : i ~ 4 ok
        for i in 0 ..< arr.count - 1 {
            pivotIndex = i
            for j in i ..< arr.count - 1 {
                count += 1
                
                print(count, "th, compare index of ",pivotIndex, "and", j+1)
                if (arr[pivotIndex] > arr[j+1]) {
                    pivotIndex = j
                }
            }
            arr.swapAt(i, pivotIndex)
           
            print("\(i)th repetion end !")
            print("result: \(arr)\n")
        }
        print("total count: \(count)")
        return arr
    }
    
    
    
    selectionSort(array: IntArray)
    
    
    
    //[4, 3, 5, 2, 1]
    //
    //1 th, compare index of  0 and 1
    //2 th, compare index of  0 and 2
    //3 th, compare index of  0 and 3
    //4 th, compare index of  2 and 4
    //1th repetion end !
    //result: [2, 3, 5, 4, 1]
    //
    //5 th, compare index of  1 and 2
    //6 th, compare index of  1 and 3
    //7 th, compare index of  1 and 4
    //2th repetion end !
    //result: [2, 4, 5, 3, 1]
    //
    //8 th, compare index of  2 and 3
    //9 th, compare index of  2 and 4
    //3th repetion end !
    //result: [2, 4, 3, 5, 1]
    //
    //10 th, compare index of  3 and 4
    //4th repetion end !
    //result: [2, 4, 3, 5, 1]
    //
    //total count: 10

     

    With Generic

     

    해당 Sorting function 을 다른 Type 에도 적용하기 위해서는, Int 가 아닌 Generic Type 을 써주도록 합니다. 

    func selectionSortWithFor<T: Comparable> (array: [T]) -> [T] {
        var pivotIndex = 0
        var arr = array
    
        for i in 0 ..< arr.count - 1 {
            pivotIndex = i
            for j in i ..< arr.count - 1 {
                if (arr[pivotIndex] > arr[j+1]) {
                    pivotIndex = j
                }
            }
            arr.swapAt(i, pivotIndex)
        }
        return arr
    }

     

    'DataStructure + Algorithm > Basic Theories' 카테고리의 다른 글

    LinkedList  (0) 2021.10.13
    Stack, Queue With Swift  (0) 2021.10.12
    Insertion Sort with Swift  (0) 2021.10.09
    Bubble Sort With Swift  (0) 2021.10.08
    Array Sorting Algorithms  (0) 2021.10.08
Designed by Tistory.