JAVA/java 실습

[자바JAVA]일차원배열 - 버블소팅, 배열 오름차순으로 정렬하기, 내림차순 정렬하기

자바칩 프라푸치노 2020. 9. 28. 19:50

안녕하세요

오늘은 오름차순 내림차순으로 정렬하는 버블소팅에 대해 배워보겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import java.util.Arrays;
 
public class SortEx {
 
    public static void main(String[] args) {
        //버블 소팅(정렬), 선택정렬과 유사하다
        // 개념: 서로 인접한 두 원소를 검사하여 정렬하는 알고리즘
        // 인접한 2개의 값을 비교하여 크기가 순서대로 되어 있지 않으면 서로 교환한다.
        // 버블 정렬은 첫 번째 자료와 두 번째 자료를, 두 번째 자료와 세번째 자료를....
        // 이런식으로 (마지막 -1)번째 자료와 마지막 자료를 비교하여 교환하면서 자료를 정렬한다.
        int[] score = new int[5];
        
        for (int i = 0; i < score.length; i++) {
            score[i] = (int)(Math.random()*45 +1);
        }
        System.out.print("정렬 전: ");
        System.out.println(Arrays.toString(score));
        
        //정렬하는 코드
        System.out.println("--------------------");
        for (int i = 0; i < score.length; i++) {
            for (int j = 0; j < score.length-1; j++) {
                //값을 바꾸는 코드
                if (score[j]> score[j+1]) {//오름차순 , 내림차순으로 바꾸고 싶으면 부등호 바꾸면 됨
                    int temp = score[j];
                    score[j] = score[j+1];
                    score[j+1= temp;
                }
            }
            System.out.println(Arrays.toString(score));
        }
        
        //Arrays.sort(score);
        System.out.println("--------------------");
        System.out.print("정렬 후: ");
        System.out.println(Arrays.toString(score));
        
        //단순하지만 비효율적인 정렬방법 : 버블정렬, 선택정렬, 삽입정렬
        //복잡하지만 효율적인 정렬방법 : 퀵정렬, 힙정렬, 합병정렬, 쉘정렬
        
        
    }
 
}
 
cs

 

하나씩 살펴보겠습니다.

 

int배열 score에 5개의 방을 만들었습니다.

그리고 for문을 통해서 1~45까지의 난수를 발생시켜

랜덤으로 값을 집어넣고 있습니다.

Arrays.toString을 하면 배열이 보기좋게 출력이 됩니다.

 

이것이 바로 이번에 살펴볼 정렬 코드입니다.

for문은 이중으로 돌려야하구요

첫번째 for문은 배열의 길이만큼

두번째 for문은 배열길이 -1 만큼 돌려야합니다.

 

만약에 배열이 [34, 5, 4, 44, 3] 이렇게 나왔다고 치면

 

if문 부터 보겠습니다.

score[0] 이 score[1]보다 크면

temp에 score[0]값을 넣고

score[0]에 score[1]값을 넣고

scroe[1]에 temp값을 넣어라(score[0]을 temp가 가지고 있으니 score[0]을 넣으라는 말과 동일)

결국에 score[0]이 score[1]보다 크면 둘이 순서 바꿔라는 뜻이죠

 

그니까 처음 안의 for문을 시행하면 

[5, 34, 4, 44, 3]

이 되겠구요

j가 1이 되면 

socre[1]이랑 score[2]랑 비교해서 바꾸니까

[5, 4, 34, 44, 3]

이 되고

j가 2이면 score[2]랑 score[3]이랑 비교하니

[5, 4, 34, 44, 3]

j가 3이면 score[3]이랑 score[4]랑 비교하니

[5, 4, 34, 3, 44]

이렇게 되고

 

j는 4가 되면

score[4]랑 score[5]랑 비교해야하는데

score는 길이 5라서 score[5]인덱스가 없죠!

그러니까 안의 for문은 score길이 -1만큼 돌리는 것입니다.

 

그래서 전체 for문을 돌리다 보면

큰 값이 오른쪽으로 정렬이 됩니다.

 

 

이렇게 정렬 되었습니다.

 

내림차순으로 정렬하고 싶다면

if문에서 부등호를 < 이걸로 바꿔주면 끝이겠네요!

728x90