[Algorithm] Sorting 알고리즘
정렬 알고리즘에 대해서 방법과 예시를 설명하였습니다.
버블정렬
방법
- 배열 내에서 연속된 두 항목을 가리킨다.
- 첫 번째 항목과 두 번째 항목을 비교한다.
- 두 항목의 순서를 비교하여 교환한다. (순서가 올바르다면 아무것도 하지 않는다.)
- 포인터를 오른쪽으로 한 칸씩 이동한다.
- 배열의 끝까지 도달할때까지 1번부터 4번을 반복한다.
- 더 이상 교환하지 않을 때까지 1번부터 5번을 반복한다.
예시
-
아래 배열을 정렬한다고 가정
-
첫번째 반복
-
두번째 반복
-
세번째 반복
-
네번째 반복
-
(더 이상 교환이 이루어지지 않았으므로) 마지막 반복
-
정렬 완료
선택정렬
방법
- 배열의 각 셀을 왼쪽부터 오른쪽 방향으로 확인하면서 어떤 값이 최솟값인 지 결정한다.
- 최소값의 인덱스와 처음 시작했을 때의 값을 교환한다.
- 데이터가 모두 정렬될 때까지 1번부터 2번을 반복한다.
예시
-
아래 배열을 정렬한다고 가정
-
최솟값 3을 찾아 처음 값(4)와 교환
-
최솟값 4을 찾아 처음 값(11)와 교환
-
최솟값 7을 찾아 처음 값(8)와 교환
-
최솟값 8을 찾아 처음 값(11)와 교환
-
정렬 완료
삽입 정렬
방법
- 임시로 인덱스 1(두 번째 셀)의 값을 삭제하고 이 값을 임시 변수에 저장한다. 인덱스 1에는 공백이 생긴다.
- 다음으로 공백 왼쪽에 있는 각 값을 가져와 비교한다.
- 공백 왼쪽에 있는 값이 임시 변수에 있는 값보다 크면 오른쪽으로 시프트한다.
- 임시로 삭제한 값보다 작은 값을 만나거나 배열의 왼쪽 끝에 도달해야 끝난다.
- 임시로 제거한 값을 현재 공백에 삽입한다.
- 배열이 완전히 정렬될 때까지 1단계부터 3단계를 반복한다.
예시
-
아래 배열을 정렬한다고 가정
-
인덱스 1번째 11을 임시 변수에 저장한다고 가정. 작은 값(4)를 만났기 때문에 시프트 종료
-
인덱스 2번째 8을 임시 변수에 저장한다고 가정. 작은 값(4)를 만났기 때문에 시프트 종료
-
인덱스 3번째 3을 임시 변수에 저장한다고 가정. 배열의 왼쪽 끝에 도달하였기 때문에 시프트 종료
-
인덱스 4번째 7을 임시 변수에 저장한다고 가정. 작은 값(4)를 만났기 때문에 시프트 종료
-
정렬 완료
퀵정렬
배열 분할
- 왼쪽 포인터를 한 셀씩 계속 오른쪽으로 옮기면서 피벗보다 크거나 같은 값에 도달하면 멈춘다.
- 이어서 오른쪽 포인터를 한 셀씩 계속 왼쪽으로 옮기면서 피벗보다 작거나 같은 값에 도달하면 멈춘다.
- 왼쪽 포인터와 오른쪽 포인터가 가리키고 있는 값을 교환한다. 4, 두 포인터가 가리키는 값이 같거나 왼쪽 포인터가 오른쪽 포인터 바로 오른쪽으로 이동할때까지 위 과정을 반복한다.
- 끝으로 왼쪽 포인터가 현재 가리키고 있는 값과 피벗을 교환한다.
퀵 정렬
- 배열을 분할한다.
- 피벗의 왼쪽과 오른쪽에 있는 하위 배열을 각가 또 다른 배열로 보고 1단계와 2단계를 재귀적으로 반복한다.
예시
-
아래 배열을 정렬한다고 가정
-
맨 마지막 인덱스의 값(7)을 pivot으로 잡고 배열을 분할한다.
-
pivot(7) 기준으로 왼쪽 오른쪽 배열을 다시 분할한다.
-
정렬 완료
Comments