목차
1. 선택정렬(Selection Sort)
2. 버블정렬(Bubble Sort)
3. 삽입정렬(Insertion Sort)
4. 퀵 정렬(Quick Sort)
5. 병합 정렬(Merge Sort)
- N * (N + 1) / 2
=> N^2
// 가장 작은 값을 찾았다면 그것과 해당 index위치의 값과 위치를 바꾼다.
1) 1 10 5 8 7 6 4 3 2 9
2) 1 10 5 8 7 6 4 3 2 9
3) 1 2 5 8 7 6 4 3 10 9
4) 1 2 3 8 7 6 4 5 10 9
5) 1 2 3 4 7 6 8 5 10 9
...
- N * (N + 1) / 2
=> N^2
// 결과적으로 가장 큰 값을 가장 뒤에 위치시키는 알고리즘이다.
1) 1 10 5 8 7 6 4 3 2 9
2) 1 5 7 6 4 3 2 8 9 10
3) 1 5 6 4 3 2 7 8 9 10
4) 1 5 4 3 2 6 7 8 9 10
5) 1 4 3 2 5 6 7 8 9 10
...
// "앞이 정렬 되어 있다고 가정하고", 어느 위치에 들어가야 하는지를 판별해서 위치를 바꿔준다.
// 여기까지 정렬이 이루어졌고
1) 1 5 10 8 7 6 4 3 2 9
// 다음 정렬 대상인 8은 _들 중 어느 위치에 들어가야 하는지 판별한다.
2) _ 1 _ 5 _ 10 _ 8 7 6 4 3 2 9
// 아래가 옳은 정렬이다.
3) 1 5 8 10 7 6 4 3 2 9
// 위 과정을 나머지 7 6 4 3 2 9에 대해서도 수행한다.
특정 값: pivot 이라고 한다.
// 가장 앞의 값을 피벗값으로 설정한다.
3 7 8 1 5 9 6 10 2 4
피벗값: 3
1) 왼쪽에서 오른쪽으로 이동하며 피벗값(3)보다 큰 값을 선택한다. : 7
2) 오른쪽에서 왼쪽으로 이동하며 피벗값(3)보다 작은 값을 선택한다. : 2
3) 선택된 큰 값과 작은 값의 위치를 바꾸어 준다.
3 2 8 1 5 9 6 10 7 4
// 위 과정 반복
3 2 1 8 5 9 6 10 7 4
4) 반복 중 큰 값의 index가 작은 값의 index보다 크다면 : 1, 8
작은 값(1)을 피벗값(3)과 위치를 바꾼다.
1 2 3 8 5 9 6 10 7 4
5) 이미 정렬이 된 3을 기준으로 왼쪽(1, 2)과 오른쪽(8, 5, 9, 6, 10, 7, 4)를 다시 정렬해준다.
각 피벗값: 1, 8
이미 정렬이 되어 있는 경우에 그러하다. 이 경우 삽입정렬이라면 빠르게 풀어낼 수 있다.
sort()함수
는 이 최악의 경우에도 O(N * logN)의 시간복잡도를 가지도록 구성되어 있다.// 일단 절반씩 나눈다.
7 6 5 8 3 5 9 1
// 정렬1
67 58 35 19
// 정렬2
5678 1359
// 정렬3
13556789