코딩클럽 알고리즘 2주차 - 탐색, 정렬
탐색 수행 능력을 평가하기 위해서는 메모리로부터 자료를 가져오는(fetch) 시간보다 자료들을 비교하는 데 걸리는 시간이 더 많이 소모되므로, 비교횟수( number of comparison )를 탐색 방법의 평가 기준으로 삼는다. 즉, 비교횟수가 적은 알고리즘일수록 좋은 성능을 보여준다고 가정한다.
왜????
데이터 양이 많아 지면 많을 수록 비교 횟수는 시간 복잡도를 잡아 먹는 원인 중 하나이기 때문에 비교 횟수가 적은 알고리즘이 탐색 및 정렬 알고리즘에 있어서 가장 중요하다. 비교 횟수가 증가 할 수록 시간 또한 증가 된다.
탐색
탐색이란, 원하는 값을 찾는 행위를 말한다. 컴퓨터 전산학에서는 탐색을 자료 구조에서 보통 값을 찾는 데 사용한다. 물론, 우리가 사용하는 상용 프로그램에서는 메일에서 보낸 이의 이름 검색, 윈도우 탐색기의 검색 기능등 많은 부분에서 우리가 알게 모르게 사용하고 있다. 검색엔진 또한 탐색에 기초로 한다. ( 내부적인 구체적인 사항은 굉장히 복잡하고 어렵다. 특히…구글 검색엔진은 시시때때로 페이지 인덱싱 알고리즘이 다르게 작동한다. )
선형탐색(Linear Search)
정렬
모든 정렬은 실제로 정렬되지 않은 자료를 갖고, “손으로” 각 단계별로 정렬을 해볼 수 있을 정도로 공부해 볼 것!!
다음 데이터를 갖고 각각의 정렬 방법을 통해 정렬의 특징들을 파악 해보도록 합니다.
- 장점
- 단점
- 특징 및 개선사항
- 총 비교 횟수
- 총 이동(자리바꿈) 횟수
- 알고리즘 복잡도 O()의 일반화
- 말로 풀어쓴 수도코드( 예, 첫번째: 두개의 항목을 비교한다, 두번째: 비교 후 자리바꿈한다 등)
- 각각의 정렬 코드를 통해, 해당 정렬방법이 갖고 있는 코드를 주목하고 비교 설명
- 이처럼 4개의 정렬방법(물론 더~많은 정렬방법이 있지만)이 각각 언제 사용되는지 알아보기.(데이터 크기, 남은 데이터 양, 정렬 유무 등등)들
다음 데이터를 갖고, 실제로 그림 그려가며 스텝별로 해보기.
33, 11, 99, 1, 22, 88, 55, 44, 66, 77
버블 정렬(Bubble sorting)
- 장점
- 단점
- 알고리즘 복잡도
말로 풀어쓴 수도 코드
- 첫 번째 원소부터 마지막 원소까지 반복하여 한 단계가 끝나면, 가장 큰 원소가 마지막 자리로 정렬 됨.
- 즉, 계속 반복하고 나면, 뒤에서 부터 정렬이 되는 특징을 가진다.
선택 정렬(Selection sorting)
장점
- 구현이 쉽다.
- 이미 정렬 되어 있으면 Swap 하지 않음
- 역정렬이 되어 있다면, N번 이하의 Swap으로 정렬이 가능.
- 단점
- 버블 정렬보다 좋을 뿐 성능은 나쁘다.
- 비교 횟수는 여전히 많다.
- 알고리즘 복잡도
- 말로 풀어쓴 수도 코드
- 전체 원소 중에서 가장 작은 원소를 선택하여 첫 번째 원소와 자리 교환.
- 그 다음으로 작은 원소를 선택하여 두 번째 원소와 자리 교환.
- 그 다음 세 번째.. 네번째를 반복한다.
- 선택 정렬은 앞에서부터 정렬이 되는 특징을 가진다.
추가하자면, 선택 정렬은 자리가 데이터를 선택한다고 이해하면 쉽다. 해당 위치에 올 데이터를 min or max 값이든 찾아서 해당하는 위치에 고정시킨다고 생각하면 오름 차순이든, 내림 차순이든 쉽게 이해 할 수 있다.
삽입 정렬(Insertion sorting)
- 장점
- 선택/버블 정렬 보다 빠르다.
- 절반 정도 정렬 되어 있는 상황에서 효율이 좋다.
- 단점
- 데이터의 이동이 잦다.
- 구현이 다른 것(선택, 버블 정렬) 보다 까다롭다.
- 알고리즘 복잡도
- 말로 풀어 쓴 수도 코드
- 정렬 된 집합/아직 정렬이 안된 집합 개념으로 나뉘어 생각하면 된다.
- 시작 후 앞에서 부터 정렬 된 집합이라고 가정/첫 번째 원소와 정렬 집합 원소와 비교하여 적절한 자리로 이동 시킨다.
- (단, 삽입정렬은 Key value 변수를 두어 해당 키 값으로 원소 비교를 한다. [물론, 제자리도 가능함] )
- 위 방법을 정렬 안 된 집합이 공집합이 될 때까지 반복하면 정렬이 끝난다.
삽입정렬은 데이터가 자리를 찾아간다고 이해하면 될 듯 싶다. 데이터에 맞는 자리 에 낑겨 넣어지는 알고리즘?!이라고 생각하면 쉽게 이해 할 수 있다.
퀵 정렬(Quick sorting)
분할 알고리즘(partition algorithm)이란?
쉽게 설명하자면, 일정 기준 값(통상적으로 Pivot 값이라 명칭)으로 데이터 리스트를 양분 하는 알고리즘이라 할 수 있다.
피봇(pivot)?
데이터 리스트 안에 존재하는 일정 기준 값(통상적으로 Pivot 값이라 명칭)
피봇 선택기준
재귀 호출(Recursion)
분할 통치 기법의 경우 재귀 호출의 형태로로 짜는 것이 자연스럽다. 단, 성능상 오버헤드 증가로 퀵 정렬은 신기하게도 제자리 퀵 정렬이 가능하다. (합병정렬의 경우 제자리 정렬이 어렵다…고 전해집니다.)
- 안정성(Stability)
같은 값이더라도 기존에 있던 순서대로 유지하는지의 여부