카테고리 없음

자바 알고리즘 - 다중 반복문과 삽입 정렬

최종군 2024. 8. 30. 14:46

반복처리 속의 반복 처리 = 다중 반복문 

외부 루프 카운터가 첫 번째 값으로 설정되어 

그 상태로 내부 루프 카운터가 처음부터 마지막 값까지 변한다 

 

외부를 고정하여 내부가 변한다 

public static void main(String[] args) {

    for (int i = 2; i < 10; i++) {
        System.out.println(i + "단");
        for (int j = 1; j < 10; j++) {
            System.out.print(i + "X" +j + " = " + i*j + " ");
            System.out.println();
        }

    }

 

간단한 위에서 설명한 외부를 고정하고 내부가 처음부턱 마지막까지 변한다 

예제) 

다 변한 이후 외부가 변한다 

 


삽입 정렬 :

배열을 정렬하는 알고리즘 

 

 

class Arraysort{
    public static void printArray(int[] a){
        for (int i = 0; i < a.length; i++) {
            System.out.print(" [" + a[i]+ "] ");
        }
        System.out.println();
    }

}
public class Practice {
    public static void main(String[] args) {

    int[] a = {90,34,78,12,56};

    System.out.println("정렬 전 배열");
    Arraysort.printArray(a);

    int ins,cmp,temp;
                                            
    for (ins = 1; ins < a.length; ins++){
       
        temp = a[ins];      
        
        for (cmp = ins - 1; cmp >= 0; cmp--){
            if (a[cmp] > temp){
                a[cmp + 1] = a[cmp];
            }else {
                break;

            }
        }
        a[cmp + 1] = temp;
    }
        System.out.println("정렬 후");
        Arraysort.printArray(a);
    }
}

 

실행순서 :  

int[] a = {90,34,78,12,56};

1. 외부 for문 초기식 ins = 1; 증감식 ins < a.length;[a.length = 5] ins++{

temp = a[ins] 이 때 a[ins]는 1이므로 a[1] = 34요소가 temp에 대입이 된다 

}

temp = a[ins]; // 이 때 temp에는 34라는 값이 대입 

 

두번째 동작 내부 for문 

for (cmp = ins - 1; cmp >= 0; cmp--){
    if (a[cmp] > temp){
        a[cmp + 1] = a[cmp];
    }else {
        break;
    }
}

 

현재 cmp = 0 [ins = 1이므로 ins - 1 == 0이 된다] 

cmp == 0이 되므로 

cmp >= 0 [0 >= 0 0은 0보다 크거나 같다라는 조건이 참이 되므로 내부 for문 실행]

 

int[] a = {90,34,78,12,56};

 

 

if (a[cmp] > temp){

 

if (a[cmp] > temp){
// 현재 cmp == 0 이므로 a[cmp] = a[0] == 즉 90이라는 인덱스 요소와 
// temp == a[ins == 1] a[1] == 34라는 요소와 비교를 하게 된다

 

 

if (90 > 34) 

라는 조건은 참이므로 

a[cmp + 1] = a[cmp];

 

 

현재 cmp == 0

 

a[1] = a[0]

에는 a[0]번째 요소값을 

a[1]에 삽입을 하겠다 

 

 

현재 배열의 모습 :

int[] a = {90,90,78,12,56};

 

 

세 번째 다시 내부 for문 실행 : 

 

for (cmp = ins - 1; cmp >= 0; cmp--){

 

증감식 cmp-- 

을 통해서 cmp == -1이 된다 

 

-1 >= 0 이라는 조건은 거짓이 되므로 

내부 for문 반복문 처리를 종료한다 

 

a[cmp + 1] = temp;

 

현재 temp == 34 

 

현재 cmp == - 1 

- 1 + 1 == 0이 되므로 

a[0] == 34라는 값이 대입된다. 

 

 

두 번쨰 외부 for문 동작 

 

현재 배열 모습 

{34,90,78,12,56}

 

 

ins 값 증가 

ins == 2 

int[] a = {90,34,78,12,56};

temp = a[2] 요소 78을 

temp에 대입

temp = a[ins];

 

 

 내부 for문 

 

현재 ins == 2 

for (cmp = ins - 1; cmp >= 0; cmp--){
    if (a[cmp] > temp){
        a[cmp + 1] = a[cmp];
    }else {
        break;
    }
}

 

cmp = 2 - 1 즉 1이라는 값을 대입 

if a[cmp] > temp 

90과 78이라는 if문 조건은 참이 되므로 

if문 수행 

 

현재 cmp == 1 

a[cmp + 1] = a[cmp] 

즉 a[1] 요소의 값을 a[2]요소에 대입한다 

이 때 

 

현재 배열 모습 {34,90,90,12,56}

다시 cmp 값을 감소 

이 때 cmp == 0이된다

 

cmp{0} >= 0 은 조건이 참이므로 내부 반복문을 수행

 

 

for (cmp = ins - 1; cmp >= 0; cmp--){
    if (a[cmp] > temp){
        a[cmp + 1] = a[cmp];
    }else {
        break;
    }
}

 

a[cmp]

= 34와 temp == 78

if 조건 34 > 78  조건이 거짓이므로 

반복문을 종료한다 

 

이 떄  

a[cmp + 1] = temp 

현재 cmp == 0 

a[1]에 temp를 대입한다 

 

이런식으로 삽입 정렬을 하면 된다