오늘은 버블정렬에 대해서 복습을 했습니다.
복습한 김에 기록합니다.
버블정렬(Bubble Sort) 이란?
옆에있는 요소와 비교를 해가며 검사하고 정렬하는 방법입니다.
버블정렬의 특징
- 시간복잡도가 O(n^2) 이기때문에 상당히 느리다.
- 가장 간단한 알고리즘이다.
...
...
...
이렇게 쭉나가게 되는데요 여기서 핵심이있습니다.
맨마지막 값들은 비교할 필요가 있을까요?
거품은 한번올라가면 내려가지않습니다.
다시 얘기하면, 이미 처음 정렬에서 9는 제일 큰수 임을 비교 당했기 때문에
두번째 정렬을 할때는 비교할 필요가 없다는 말이죠.
소스코드로 보겠습니다.
#include <iostream> int main() { int array[10] = {10, 3, 4, 45, 34, 23, 12 ,42, 13, 33}; //초기화 for(int i = 0; i < sizeof(array) / sizeof(int); i++){ //오름차순정렬 for(int j = 0; j < sizeof(array) / sizeof(int) - 1 - i; j++){ if(array[j] > array[j + 1]){ int temp = array[j + 1]; array[j + 1] = array[j]; array[j] = temp; } } } for(int i = 0; i < sizeof(array) / sizeof(int); i++){ // 출력 printf("%4d", array[i]); } std::cout << std::endl; return 0; }
for
(
int
i = 0; i <
sizeof
(array) /
sizeof
(
int
); i++){
for
(
int
j = 0; j <
sizeof
(array) /
sizeof
(
int
) - 1 - i; j++){
}
}
- 1을 하는 이유
for
(
int
j = 0; j <
sizeof
(array) /
sizeof
(
int
) - 1 - i; j++){
if
(array[j] > array[j + 1]){
int
temp = array[j + 1];
array[j + 1] = array[j];
array[j] = temp;
}
}
여기서
-1을 하지않는다면
array[0] > array [1] (비교 생략)
array[1] > array [2] (비교 생략)
array[2] > array [3] (비교 생략)
array[3] > array [4] (비교 생략)
array[4] > array [5] (비교 생략)
array[5] > array [6] (비교 생략)
array[6] > array [7] (비교 생략)
array[7] > array [8] (비교 생략)
array[8] > array [9] (비교 생략)
array[9] > array [10] (비교 생략)
이렇게 진행이 되는데요
이상한점이있습니다
소스코드의 array[] 는
array[0] ~ array[9]까지의 범위인데
맨마지막 비교에서
array[9] > array [10] (비교 생략)
array[10]을 말하고있습니다.
이러면 배열의 인덱스값을 벗어나 원치않은 값을 얻습니다.
- 1을 해주게 된다면
비교횟수는 1번 줄게 되겠지만
줄어도 됩니다.
왜냐하면
처음 i = 0 의 비교가 끝난다면
마지막은 제일 큰 값이 자동적으로 들어가기 때문입니다.
내림차순으로 하려는 분들은
if
(array[j] < array[j + 1])
이렇게 조건을 바꿔주면 됩니다.
이상 버블정렬이었습니다.
알고리즘 두번째 글이네요 !
미숙한 점들 지적 부탁드립니다!
알게된점 : 사실 버블정렬을 외우고만 있었는데 다시한번 머릿속에서 정리가 되었다.
알아야할점 : Big - oh(O) 표기법을 자세히 알아야함. 시간복잡도(Time Complexity), 공간복잡도(Space Complexity) 등등
'알고리즘' 카테고리의 다른 글
[알고리즘] 개미수열 (0) | 2018.01.08 |
---|