본문 바로가기
lecture.js/algorithm.log

#012 버블 정렬

by malda 2017. 7. 18.
# 문제)
아래와 같이 정렬되지 않은 배열이 있을때 버블 정렬을 사용하여 오름차순 정렬하여라.

<초기>
5
2
4
3
1


버블 정렬이란 인접한 두개의 원소끼리 비교하여 정렬해가는 방법을 말한다.
O(n^2) 성능을 가짐.
먼저, 정렬이 진행되는 순서를 보며 규칙성을 찾아보자.

<1회전>
2
5
4
3
1
2
4
5
3
1
2
4
3
5
1
2
4
3
1
5


<2회전>
2
4
3
1
5
2
3
4
1
5
2
3
1
4
5


<3회전>
2
3
1
4
5
2
1
3
4
5


<4회전>
1
2
3
4
5


1회전이 완료되면 맨 마지막 원소는 정렬이 완료 됬다는 것을 알 수 있다.
즉, 정렬이 진행 되는 과정을 보면 회전 수가 진행 될 때마다 비교하는 횟수가 그에 맞게 감소하고 있는 것을 알 수 있다.

package dataStructure.sort.bubble;

public class BubbleSort {

    private int[] array;
    private int size;
    private int maxSize;
   
    public BubbleSort(int maxSize) {
        // TODO Auto-generated constructor stub
        this.maxSize = maxSize;
        this.array = new int[this.maxSize];
        this.size = 0;
    }
   
    public void add(int value) {
        if(size >= maxSize) {
            System.out.println("max size.. so, can't add..");
            return;
        }
        array[size++] = value;
    }
   
    public void add(int...values) {
        if((this.size + values.length) >= this.maxSize) {
            System.out.println("max size.. so, can't add..");
            return;
        }
       
        for(int i=0; i<values.length; i++) {
            this.array[this.size++] = values[i];
        }
    }
   
    public int size() {
        return size;
    }
   
    public void remove(int index) {
        if(0 <= index && index<=maxSize-1) {
            array[index] = -1;
        }else {
            System.out.println("invalid index. ");
        }
    }
   
    public void sort() {
        for(int i=0; i<size; i++) {
            for(int j=0; j<size-i-1; j++) {
                if( array[j] > array[j+1] ) {
                    swap(j,j+1);
                }
            }
        }
    }
   
    private void swap(int currentIndex, int nextIndex) {
        int temp = array[currentIndex];
        array[currentIndex] = array[nextIndex];
        array[nextIndex] = temp;
    }
   
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        StringBuilder result = new StringBuilder();
        result.append("[");
        int i = 0;
        while(i < size) {
            result.append(array[i]);
            if(i != (size - 1) ) {
                result.append(",");
            }
            i++;
        }
        result.append("]");
        return result.toString();
    }
   
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        BubbleSort bubble = new BubbleSort(10);
        bubble.add(5,2,4,3,1);
        System.out.println(bubble);
        bubble.sort();
        System.out.println(bubble);
    }

}


# 응용문제)
이미 정렬된 경우 계속 반복하여 정렬을 수행한다. 이를 개선할 수 있는 방법은?

정렬이 필요한 경우, swap이 발생됨을 알 수 있다.
따라서 한번도 swap이 발생하지 않았다는 것은 이미 정렬 되었음을 의미한다.


package dataStructure.sort.bubble;

public class BubbleSort {

    private int[] array;
    private int size;
    private int maxSize;
   
    public BubbleSort(int maxSize) {
        // TODO Auto-generated constructor stub
        this.maxSize = maxSize;
        this.array = new int[this.maxSize];
        this.size = 0;
    }
   
    public void add(int value) {
        if(size >= maxSize) {
            System.out.println("max size.. so, can't add..");
            return;
        }
        array[size++] = value;
    }
   
    public void add(int...values) {
        if((this.size + values.length) >= this.maxSize) {
            System.out.println("max size.. so, can't add..");
            return;
        }
       
        for(int i=0; i<values.length; i++) {
            this.array[this.size++] = values[i];
        }
    }
   
    public int size() {
        return size;
    }
   
    public void remove(int index) {
        if(0 <= index && index<=maxSize-1) {
            array[index] = -1;
        }else {
            System.out.println("invalid index. ");
        }
    }
   
    public void sort() {
        boolean isSorted = false;
        for(int i=0; i<size; i++) {
            System.out.printf("[%d번째] \n",(i+1));
            isSorted = true;
            for(int j=0; j<size-i-1; j++) {
                System.out.printf("\t[%d번째] ",(j+1));
                if( array[j] > array[j+1] ) {
                    swap(j,j+1);
                    isSorted = false;
                }
                System.out.println();
            }
            if(isSorted) {
                break;
            }
        }
    }
   
    private void swap(int currentIndex, int nextIndex) {
        int temp = array[currentIndex];
        array[currentIndex] = array[nextIndex];
        array[nextIndex] = temp;
        System.out.printf("swap ");
    }
   
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        StringBuilder result = new StringBuilder();
        result.append("[");
        int i = 0;
        while(i < size) {
            result.append(array[i]);
            if(i != (size - 1) ) {
                result.append(",");
            }
            i++;
        }
        result.append("]");
        return result.toString();
    }
   
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        BubbleSort bubble = new BubbleSort(10);
        //bubble.add(5,2,4,3,1);
        bubble.add(1,2,3,4,5);
        System.out.println(bubble);
        bubble.sort();
        System.out.println(bubble);
    }

}

'lecture.js > algorithm.log' 카테고리의 다른 글

#014 삽입 정렬  (0) 2017.07.18
#013 선택 정렬  (0) 2017.07.18
#011 한글로 변환  (0) 2017.07.18
#010 소인수분해  (1) 2017.07.12
#009 소수 판별  (0) 2017.07.12