
정렬 알고리즘 이야기는 재밌는 것 같다.

예전에 유튜브에서 유행했던 'Sound Sorting Algorithm'에 꽂혔던 적이 있어서, 한동안 얘네들을 엄청 봤었는데,
정렬 알고리즘 개념 강의를 듣다보면 얘네들이 생각나서 이해가 조금 빠르게 되는 것 같다.
여담이지만 난 Bubble sort가 싫었다. 무지막지하게 시간이 걸려서. O(n²)
https://youtu.be/kPRA0W1kECg?t=241
^ Bubble Sort를 보여주는 부분.
실제로 '현재 음'의 '다음의 음'을 찾아내면 '현재 음'의 옆에 붙여두기 때문에, 빨간 포인터가 반복할 때마다 탐색하는 범위가 -1씩 되는 것을 시각적으로 확인할 수 있다.
| Best Case | Average Sort | Worst Case |
|---|---|---|
| O(n) 이미 정렬된 경우 | O(n^2) | O(N^2) |
이럴 줄 알았다.
원리도 너무 단순하고, 아마 정렬 알고리즘 중에 가장 오래 걸릴 것 같다.
위에 있는 유튜브 영상에서도, 데이터를 반으로 나누어 양방향에서 버블 소트를 병렬로 진행하는 알고리즘이 있었는데. 그 친구는 시간 복잡도가 어느정도 나올 지 궁금하다.
import java.io.*;
import java.util.*;
public class BubbleSort {
public static void bubbleSort(int[] arr) {
int size = arr.length;
for (int i = 0; i < size - 1; i++) {
// 이 부분은 n-1을 구현하는 것이 중요한 부분이기에
// 구분을 개인 역량대로 바꿀 수 있다.
// 내가 이해하기 쉬운 것이 중요하다!!!
for (int j=0; j < size - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j + 1] = temp;
}
}
}
}
public static void main(String[] args) throws IOException {
int[] arr = {5, 3, 8, 4, 2};
System.out.println("정렬 전: " + Arrays.toString(arr));
bubbleSort(arr);
System.out.println("정렬 후: " + Arrays.toString(arr));
}
}
역대급으로 재밌었다!!!

(GPT한테서 추가적으로 대답해보라는 질문들을 받았다.)
첫 번째 for문 반복문으로 데이터를 정렬하기를 반복하고,
두 번째 for문에서 인접한 두 값을 비교하여 올바른 순서로 두기 때문.
-> 한 번의 pass로는 정렬이 끝나지 않기에 반드시 반복되는 for문을 사용하게 된다.
i번째 라운드에서 두 번째 for문은 '이미 정렬 끝난 값'을 다시 비교할 필요가 없다.
매 라운드가 끝날 때마다 '이미 끝난 값'은 고정되어 정렬되기에 size-1=i가 된다.
bubble sort는 당장 옆에 있는 노드와 비교하여 자리를 바꾸기 때문에?
이건 뭔 질문이지?
무작위였던 데이터 값이 정렬이 된다.