알고리즘에 대해 공부를 하려고 구글 혹은 책을 보면 정렬알고리즘이 우선적으로 나옵니다.
처음에는 그냥 당연하게 공부를 했습니다.
Ex) 그냥 교과서에서 덧셈, 곱셉, 나눗셈 순서대로 나와서 공부하는것 처럼
그러다 문득 왜 정렬 알고리즘을 공부해야할까? 왜 모든사람이, 어느곳에서나 정렬 알고리즘을 우선적으로 배워라 라고 할까? 그렇게나 중요한것인가??
라는 의문이 생겼습니다.
그래서 인터넷에 이유를 찾아보았습니다.
생각보다 저와같이 의문을 가진 사람들이 꽤 많았고 그분들의 의견을 보고 왜 정렬알고리즘을 공부해야 하는지에 대해 2가지의 이유로 의문이 해결되었습니다.
많이 사용하는 알고리즘 입니다.
- 배달앱에서 음식주문을 할때 별점 높은순서, 많이 시켜먹은 순서 등
- 지도 앱에서 음식점을 검색하면 가까운 거리 순서로 정렬된 결과를 보여줍니다.
- 페이스북은 내가 좋아할만한 게시물 순으로 뉴스피드를 정렬합니다.
많이 사용하니까? 오케이 그렇지만 이미 훌륭한 개발자분들이 정렬 알고리즘 다 만들어놨고, JavaScript에는 이미 내장된 정렬 함수sort()가 있는데, 그걸로 다 해결하면 되지 않을까? 이정도로는 의문이 시원~하게 해결되지 않습니다.
알고리즘을 배우는 가장 좋은 교과서이다.
- 이렇게 사용하면 더 빨라지지 않을까?
- 이 아이디어를 적용하면 더 안정적이지 않을까?
- 같은 정렬이라도 더 빨리 정렬할 수 있지 않을까?
- 더 효율적으로 정렬 할 수 있지 않을까?
- 시간복잡도는 얼마나 걸릴까?
이런 고민을 하는것이 알고리즘 공부를 하는데 많은 도움이 된다고 합니다.
따라서 정렬알고리즘을 통해 알고리즘에 대해 잘 공부를 한다면 정렬알고리즘에서 뿐만 아니라, 실제 개발을 하면서 맞닥뜨릴 수많은 문제들을 해결하는데 많은 도움을 얻을 수 있을 것 같습니다. 의문이 해결되었으니 정렬 알고리즘에 대해 공부를 해보겠습니다.
선택정렬을 말 그대로 최소값을 선택해서 정렬
하는 것 입니다.
선택정렬은 데이터가 중복된 경우 위치가 바뀔 수 있기 때문에 Unstable한 정렬
입니다.
선택정렬 하는법
메모리가 절약
됩니다.구현하기 쉬운
알고리즘 입니다.in-place 알고리즘 : 원소들의 개수에 비해 충분히 무시할 만한 저장 공간만을 더 사용하는 알고리즘
최선의 경우
: O(n^2)최악의 경우
: O(n^2)아래의 사진에서
삽입정렬은 정렬되지 않은 배열의 첫번째값을 정렬된 값의 적절한 위치에 삽입하는
정렬입니다.
삽입 정렬은 중복된 데이터는 위치를 교환하지 않기 때문에 stable한
정렬입니다.
삽입정렬 하는법
삽입 합니다.
메모리가 절약
됩니다.구현하기 쉬운
알고리즘 입니다.in-place 알고리즘 : 원소들의 개수에 비해 충분히 무시할 만한 저장 공간만을 더 사용하는 알고리즘
최선의 경우
: O(n)최악의 경우
: O(n^2)아래의 사진에서
버블정렬은 거품이 일어나듯이 연쇄적으로 자기 자리를 찾아간다고 해서 버블 정렬이라고 합니다.
버블정렬은 데이터가 중복된 경우 위치를 교환하지 않고 지나가기 때문에stable한 정렬
입니다.
데이터를 2개씩 묶어서 비교한 후 크기가 큰 쪽이 오른쪽으로 가도록 자리를 바꾸기 때문에 n번째 정렬이 끝나면 뒤에서 n번째 데이터들이 정렬 되어있습니다.
버블정렬 하는법
메모리가 절약
됩니다.구현하기 쉬운
알고리즘 입니다.in-place 알고리즘 : 원소들의 개수에 비해 충분히 무시할 만한 저장 공간만을 더 사용하는 알고리즘
최선의 경우
: O(n)최악의 경우
: O(n^2)아래의 사진에서
한 칸씩 오른쪽으로 이동하며 왼쪽에서 2개씩 비교해줍니다.
1-1 첫번째 값과 두번째값을 비교해서 큰값을 오른쪽에 둡니다. 비교할 값 : 4,2 큰값 4
1-2. 첫번째 값과 두번째값을 비교해서 큰값을 오른쪽에 둡니다. 비교할 값 : 4,1 큰값 4
1-3. 첫번째 값과 두번째값을 비교해서 큰값을 오른쪽에 둡니다. 비교할 값 : 4,3 큰값 4
한 칸씩 오른쪽으로 이동하며 왼쪽에서 2개씩 비교해줍니다.
1-1 첫번째 값과 두번째값을 비교해서 큰값을 오른쪽에 둡니다. 비교할 값 : 2,1 큰값 2
1-2. 첫번째 값과 두번째값을 비교해서 큰값을 오른쪽에 둡니다. 비교할 값 : 2,3 큰값 3
한 칸씩 오른쪽으로 이동하며 왼쪽에서 2개씩 비교해줍니다.
1-1 첫번째 값과 두번째값을 비교해서 큰값을 오른쪽에 둡니다. 비교할 값 : 1,2 큰값 2