버블정렬이던, 선택정렬이던
중요한 포인트는 시간복잡도 입니다.
구현할 때엔 항상 최악의 경우를 가정 및 생각해서 구현하여야 합니다.
--> 즉, 시간복잡도 생각해야한다는 말입니다.
bubble sort는 두 인접한 데이터의 크기를 비교해 정렬하는 방법입니다.
최악의 경우 시간복잡도 : O(n^2)입니다. (n은 데이터 즉, 원소의 개수) 이미 정렬되어 있는 경우에도 항상 배열 전체를 checking(스캔)해야 하기 때문입니다.
또한, 코딩테스트를 볼 때, 최악의 경우를 가정하고 코드를 구현하기 때문에,
시간복잡도가 O(n^2)이면 시간제한에 걸리기 쉽습니다. 이러한 단점때문에 쉽지않습니다.
평균적인 시간복잡도: O(n²)입니다. 원소의 위치에 관계없이 전체 배열 스캔이 반복되기 때문입니다.
최선의 경우 시간복잡도: O(n). 이미 정렬되어 있는 경우에도 항상 배열 전체를 스캔하게 되지만, 일반적으로는 최소 n-1번의 비교가 필요합니다.
버블 정렬은 간단하게 구현할 수 있는 장점이 있지만, 시간복잡도 측면에서 효율적이지 않은 알고리즘입니다. 실제 상황에서는 더 나은 성능을 갖는 다른 정렬 알고리즘들(퀵 정렬, 병합 정렬 등)이 더 자주 사용되지만,
근본인 버블 및 선택 정렬이 돌아가는 원리와 시간복잡도가 O(n^2)인 이유는 파악하고 있어야합니다.
int N = 5;
int[]arr = new int[N];
for(int i=0;i<arr.length;i++){
arr[i]= // 입력받는 스트림 작성 버퍼 || 스캐너
}
// SORTING --> 이 부분이 해당 알고리즘의 핵심
for(int i=0;i<N-1;i++){
for(int j=0;j<N-1-i;j++){
if(arr[j]>arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
swap
하는 것이 선택정렬의 핵심입니다.지극히 평균적인 성능에서도 시간복잡도가 좋지 않습니다.
--> 이러한 이유때문에 앞서 말했듯이,
시간복잡도가 O(n^2)이라서 잘 채택되지 않으나, 원리는 이해하고 있어야합니다.
왜냐하면, 난이도가 높은 알고리즘을 구현할 때,
부분적으로 선택 또는 버블정렬이 필요한 순간이 오기 때문입니다.
불안정 정렬: 값이 같은 원소들 간의 순서가 정렬 후에 바뀔 수 있어 상대적인 순서가 변경될 수 있습니다.