C언어 기준으로 크기 5의 배열이 있고
int data[5] = {0,5,1,2,3}
0 1 비교 -> {5,0,1,2,3}
1 2 비교 -> {5,1,0,2,3}
2 3 비교 -> {5,1,2,0,3}
3 4 비교 -> {5,1,2,3,0}
0 1 비교 -> {5,1,2,3,0}
1 2 비교 -> {5,2,1,3,0}
2 3 비교 -> {5,2,3,1,0}
. . .
이게 버블 정렬이잖아.
바로 옆에 원소랑 비교하는거
그럼 이건 뭐임?
int data[5] = {0,5,1,2,3}
0 1 비교 -> {5,0,1,2,3}
0 2 비교 -> {5,0,1,2,3}
0 3 비교 -> {5,0,1,2,3}
0 4 비교 -> {5,0,1,2,3}
1 2 비교 -> {5,1,0,2,3}
1 3 비교 -> {5,2,0,1,3}
1 4 비교 -> {5,3,0,1,2}
2 3 비교 -> {5,3,1,0,2}
2 4 비교 -> {5,3,2,0,1}
난 후자가 존나 간단하길래 당연히 이게 버블 정렬인줄 알고 쓰고 있었는데 아니네
꼬추정렬 - dc App
선택정렬 짭퉁
후자는 별로야?
그냥 완전탐색 O(n^2)인데 별루지 근데 외워서 쓰기엔 가장 간단하긴 함
교환정렬임
버블정렬은 원래 얼마나 정렬되어있느냐 따라 속도가 달리지지만 교환정렬은 정렬되어있든 말든 n^2으로 느림
아 그래?? 왜 그러지? 위에 5개의 예만 봐도 버블정렬은 5*4번, 후자는 (1+2+3+4) 10번인데
버블정렬의 경우 이미 정렬되어 있으면 n번의 비교만 하면 됨 교환정렬은 정렬되어 있든 말든 n(n-1)/2번의 비교를 해야함
정확히 말하면 버블정렬은 n-1번 비교겠네 아무튼
그리고 교환정렬 쓸바에는 선택정렬 쓰셈 알고리즘은 똑같은데 코드 조금 바꿔서 교환하는 오버헤드를 줄인게 선택정렬임
왜 ? 버블정렬은 이미 정렬되어 있으면 비교를 안해? if문 쓰는게 비교하는거 아니야?
비교는 하지 이미 정렬되어 있다면 버블정렬은 n-1번 비교하고 끝임
생각 해보셈 버블정렬은 한번 돌았을때 이미 정렬되어 있다면 교환이 안일어남 이걸로 정렬을 더 할건지 말건지 결정하는게 가능함 선택정렬은 한번 돌았다고 해도 이 배열이 정렬되어 있는지 알 수 없음 다만 첫번째 원소가 무엇이 올것인지를 확신할 수 있을뿐이지
당연히 평균적인 상황에서는 후자가 빠르다
버블정렬이랑 선택정렬 둘다 한번 루프를 돌때 자리 하나가 결정되는건 똑같은데 중간에 정렬이 완료되었나 안되었나를 추가적으로 넣은게 버블정렬이라고 생각하면 더 쉽겠네
선택정렬임
교환정렬이 맞음 배열안의 값이 계속 교환되잖아 선택정렬은 자리만 정해놨다가 한번에 바꾸는거고