상대적으로 비효율적으로 동작하는 기본 정렬들이다.
1. 버블 정렬(Bubble Sort)
바로 옆의 원소와 비교하며 큰 수를 마지막에 오게 한다.
루프 한 번마다 큰 수를 하나씩 정렬한다.
void BubbleSort(vector<int>& v)
{
for (int i = 0; i < v.size() - 1; i++)
{
int temp = 0;
for (int j = 0; j < v.size() - 1 - i; j++) // 이미 정렬 완료된 요소는 스킵
{
if (v[j] > v[j + 1])
{
temp = v[j];
v[j] = v[j + 1];
v[j + 1] = temp;
}
}
}
}
인덱스는 0부터 시작하기 때문에, 인덱스 4번까지 정렬을 하겠다면 벡터의 사이즈보다 1 작은 만큼 정렬해야 한다.
또한 이미 정렬이 완료된 뒤쪽 원소를 스킵하기 위해 안쪽 루프문에서 i 만큼 빼준다.
- 시간 복잡도 : (N - 1) + (N - 2) + ... + 2 + 1 = N(N-1) / 2 = O( N^2 )
2. 선택 정렬(Selection Sort)
배열 중에 가장 크거나 작은 값을 선택해서 정렬.
이미 정렬한 원소를 제외하고 나머지 원소 중에서 고른다.
이 때 원소를 직접 고르는 것 보다는 인덱스를 고른다는 것이 중요하다.
void SelectionSort(vector<int>& v)
{
for (int i = 0; i < v.size() - 1; i++)
{
int bestIndex = i;
for (int j = i + 1; j < v.size(); j++)
{
if (v[j] < v[bestIndex])
bestIndex = j;
}
int temp = v[i];
v[i] = v[bestIndex];
v[bestIndex] = temp;
}
}
배열에서 가장 작은 숫자를 bestIndex에 저장하고 배열의 맨 앞에 저장한다.
그리고 정렬이 끝난 원소를 스킵하기 위해 j를 도입한다.
- 시간 복잡도 : (N - 1) + (N - 2) + ... + 2 + 1 = N(N-1) / 2 = O( N^2 )
3. 삽입 정렬(Insertion Sort)
원소를 하나 선택해서 정렬된 것으로 둔다.
다음 원소를 선택해서 이미 정렬된 다른 원소보다 크면 그 원소의 뒤에 둔다.
그 다음 원소를 정렬된 다른 원소와 비교해서 크면 그 원소의 뒤에 둔다.
void InsertionSort(vector<int>& v)
{
for (int i = 1; i < v.size(); i++) // 첫 원소는 정렬된 것으로 간주함
{
int insertData = v[i]; // 원소 선택
int j;
for (j = i - 1; j >= 0; j--)
{
if (v[j] > insertData) // 선택한 원소가 더 작으면
v[j + 1] = v[j]; // 비교한 원소를 오른쪽에 저장
else
break; // 선택한 원소가 더 크면
}
v[j + 1] = insertData; // 선택한 원소를 오른쪽에 저장
}
}
- 시간 복잡도 : (N - 1) + (N - 2) + ... + 2 + 1 = N(N-1) / 2 = O( N^2 )
'자료구조와 알고리즘 > 정렬 & 해시 테이블' 카테고리의 다른 글
5-4. 해시 테이블(Hash Table) (0) | 2023.07.20 |
---|---|
5-3. 퀵 정렬(Quick Sort) (0) | 2023.07.20 |
5-2. 힙 정렬, 병합 정렬 (0) | 2023.07.19 |