배열에서 어떤 값 하나를 선택해서 교체한다고 하여 선택 정렬이라고 한다. 이는 최소값이 아닌 최대값에도 작동한다. 최대값을 중심으로 정렬하는 경우, 배열의 맨 뒤 원소와 자리를 교체하며 루프를 돈다.

void selectionSort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
int min_idx = i;
// 최소값 arr[min_idx]를 찾는다.
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[min_idx]) min_idx = j;
}
// arr[i]와 최소값 arr[min_idx]를 swap한다.
// 이때 arr[i]의 자리는 정리되지 않은 배열 요소 중 가장 맨 앞의 자리이다.
int tmp = arr[i];
arr[i] = arr[min_idx];
arr[min_idx] = tmp;
}
}
버블 정렬에서는 서로 인접한 두 원소를 비교해나가면서 정렬한다. 배열의 첫 원소값부터 시작해서 다음 값과 비교하면서 더 크다면 다음 값과 자리를 바꾼다. 이를 배열이 모두 정렬될 때까지 반복한다.
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
삽입 정렬은 배열의 모든 요소를 앞에서부터 차례대로 비교하여 적절한 자리에 삽입하는 정렬이다.
구현을 쉽게 하기 위해 아래 코드에선 배열의 뒤에서부터 비교하여 한칸씩 밀어낸다.
void insertionSort(int arr[], int n) {
for (int i = 1; i < n; i++) {
int copy = arr[i];
// 배열은 순서를 밀어내기 복잡하므로 뒤에서부터 비교하여
// 한칸씩 밀어내면서 copy한 값을 삽입할 자리를 찾는다.
int j = i - 1;
while (j >= 0 && arr[j] > copy) {
arr[j + 1] = arr[j];
j--;
}
// 찾아낸 빈 자리에 값을 삽입한다.
arr[j + 1] = copy;
}
}
arr[i]값을 복사해 둔 후 while문에서 copy 값이 삽입될 적절한 위치를 찾는다. 만약 arr[j]가 copy 값보다 크다면 copy 값보다 뒤의 위치에 배치되어야 하므로 한칸씩 밀어낸다. 이를 반복하면 삽입할 적절한 위치를 찾을 수 있다.
시간 복잡도는 마찬가지로 을 가진다. 첫번째 for문은 번 반복되는데, 삽입할 자리를 찾기 위해 배열의 원소들을 밀어내는 데에도 최악의 경우 번의 비교가 필요하다.

잘 봤습니다. 좋은 글 감사합니다.