티스토리 뷰

반응형

안녕하세요!!

오늘은 정말 유명한 정렬 알고리즘 selection sort 짜볼거게요.

C++/C/Java 짜신거는 정말 많이 보셨을 텐데요,

저는 Swift 짜볼까 합니다 ㅎㅎ

하면서 공부가 많이 됐어요. 간단하니 계속 유명한 알고리즘들을 Swift 짜보는 연습을 계속 해보려구요 XD




선택정렬(Selection Sort)



먼저 플레이그라운드를 열어주세요!!



먼저 C++로 짠 선택정렬 코드에요.

이제 Swift로 짠 코드를 볼까요? 

import UIKit

var arr = [9,8,7,6,5,4,3,2,1]

for i in 0..<arr.count{

    var minn : Intarr[i];

    var location : Int = i;

    for j in i+1..<arr.count{

        if(minn>arr[j])

        {

            minn=arr[j];

            location = j;

        }

    }

    if i != location{

        swap(&arr[i],&arr[location])

    }

    

}

for i in 0..<8{

    print(arr[i])

}

자, C++과 비교해봤을 때, 거의 비슷하죠?

하나도 어렵지 않답니다 ㅎㅎ

아 이 코드를 짜면서 느낀점이 있는데, Swift가 정말 '안전'한 언어인가 보다.. 싶었어요.

일단 중괄호를 꼭 해야한다는 점. 

이게 안전이랑 관계가 있나 싶지만, 음.. 저는 관련이 있다고 생각해요.

C나 C++,Java같은 언어는 코드 한줄까지는 중괄호을 사용하지 않아도 됩니다. 

이 때문에 분명 같이 수행되어야 하는데, 수행되지 않는 코드가 있을 수 도 있죠.

(중괄호를 사용하지 않고 2줄 이상 썼을시)

하지만 단 한줄의 코드라도 중괄호 안에 있어야만 하는 제한이 있다면,

이런일이 발생할 일이 없겠죠?


음..그리고 정말 안전하구나;;라고 느낀 부분


좌 -  swift / 우 - C++


자, 어떤 차이가 있나요? 네, 일단 &는 둘째치고.. swift는 if문으로 감싸줬죠?

왜 감싸줬을까요?

자, 일단 i와 location이 같지 않다는 것은 예외는 

i와 location이 '같다'인 경우밖에 없겠죠?

이 i와 location이 언제 같아질까요? 네. 현재 i번째 값보다 모든 값들이 클때입니다. 

(두번째 for문 시작전에 minn을 arr[i]로 해주고, location을 i로 해주었으므로.

만약 두번 째 for문 안에서 minn>arr[j]인 조건. 즉, minn이 더 크다는 소리는 현재 arr[i]값보다 arr[j]의 값이 더 '작다'라는 소리겠죠?

하지만 이 조건문을 한번도 안 걸릴려면 minn보다 모든 값들이 '클'경우 입니다.

그럼 최종적으로 i와 location이 같아지죠.) 


아니..그걸 누가 몰라여??

왜 해줬냐구요 ㅡㅡ C++은 안해줬으면서;;

...if문으로 감싸주지 않으면 오류가 나기 때문입니다!!

그리고 이런 에러메세지를 줍니다.


fatal error: swapping a location with itself is not supported


치명적 에러 : 자기자신과 위치를 바꾸는 것은 지원되지 않습니다.

(치명적일것 까지야...)


네..에러가 나더라구요. 

그래서 함수를 따로 만들어야 하나했는데,

이렇게 검사를 해주면 된다고 하네요. 

컴파일러에게 확신을 주는거죠. 


if i != location{

        swap(&arr[i],&arr[location])

    }



i와 location이 같지 않을때만 이 코드를 수행해!
라고 조건을 걸어주는 것이죠.
정말 안전하지않나요?
(하지만 자기자신과 위치를 바꾸는게 그렇게 위험한 일인지................)


자. 어쨌든 정렬은 완벽하게 된다는 점 XD
음..C++은 자기자신과 자리를 바꾸는 것을 허용하는 것 보면..뭔가 언어마다 특성이 다른 것 같아요ㅎㅎ
새로운 걸 많이 배우게 되네요. 

도움이 되었으면 좋겠어요 XD



반응형