YoonWould!!

[정렬]간단히 정리하는 선택, 버블, 삽입 정렬 본문

<IT 용어>

[정렬]간단히 정리하는 선택, 버블, 삽입 정렬

Hading 2018. 7. 6. 00:16
728x90

1. Selection Sort

1) 개념

각 루프마다 

- 최대의 원소를 찾는다. 

- 최대의 원소와 맨 오른쪽 원소를 교환한다. 

- 맨 오른쪽 원소를 제외한다. 

하나의 원소만 남을 때 까지 위의 루프를 반복한다.

[출처: 권오흠, 영리한 프로그래밍을 위한 알고리즘 강좌]


2) Pseudocode

selectionSort(A[ ], n){   ▷배열 A[1...n]을 정렬한다.

for last ← n downto  2 {        -------------------------------①

A[1...last] 중 가장 큰 수 A[k]를 찾는다     -----------------------②

A[k] ↔ A[last]  ▷ A[k]와 A[last]의 값을 교환    -------------------------③

}

}


3) 수행시간

①의 for 루프는 n-1번 반복

②에서 가장 큰 수를 찾기 위한 비교횟수: n-1, n-2, ..., 2, 1

③의 교환은 상수시간 작업


4) 시간복잡도


5) 내가 짠 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<stdio.h>
 
int main(void){
    int i,j,min,index, temp;
    int array[10= {1,10,5,8,7,6,4,3,2,9};
    
    for(i=0;i<10;i++){
        min = 99999;
        for(j=i;j<10;j++){
            if(min > array[j]){
                min =array[j];
                index =j;
            }
        }    
        temp = array[i];
        array[i] = array[index];
        array[index] = temp;
    }
    for(i=0;i<10;i++){
        printf("%d ",array[i]);
    }
    return 0;
}
cs



2. Bubble Sort

1) 개념

두 인접한 원소를 검사하여 정렬하는 방법이다. 원소의 이동이 거품이 수면으로 올라오는 듯한 모습을 보이기 때문에 지어진 이름이다.

다른 숫자와 비교하여 제일 큰 수를 뒤로 보내는 작업은 Selection Sort와 비슷하다.

Bubble sort algorithm in programming figure.


2) Pseudocode

bubbleSort(A[ ], n) { ▷배열 A[1...n]을 정렬한다.

for last ← n downto  2 {        -------------------------------①

for i ← 1 to last-1    -----------------------②

if(A[i]>A[i+1]) then A[i] ↔ A[i+1]  ▷ 교환 -------------------------③

}

}


3) 수행시간

①의 for 루프는 n-1번 반복

②의 for 루프는 각각 n-1, n-2, ..., 2, 1번 반복

③의 교환은 상수시간 작업


4) 시간복잡도


5) 내가 짠 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//옆에 있는 값과 비교해서 더 작은 값을 앞으로 보내면 어떨까? 
//비교해주는 집합을 줄여줌으로서 구해진다. 
#include<stdio.h>
 
int main(){
    int i,j, temp;
    int array[10= {1,10,5,8,7,6,4,3,2,9};
    
    for(i=0;i<10;i++){
        for(j=0;j<9-i;j++){
            if(array[j] > array[j+1]){
                temp = array[j];
                array[j] = array[j+1];
                array[j+1= temp;
            }
        }
        
    }
    for(i=0;i<10;i++){
        printf("%d ",array[i]);
    }
    return 0;
cs


3. Insertion Sort (삽입 정렬)

1) 개념

자료 배열의 모든 요소를 앞에서 부터 차례대로 이미 정렬된 배열 부분과 비교하여, 자신의 위치를 찾아 삽입함으로써 정렬을 완성하는 알고리즘이다.

Insertion Sort


2) Pseudocode

insertionSort(A[ ], n){ ▷배열 A[1...n]을 정렬한다.

for i ← 1 to { -------------------------------① 

A[1...i]의 적당한 자리에 A[i]를 삽입한다. -------------------②

}

}


3) 수행시간

①의 for 루프는 n-1번 반복

②의 삽입은 최악의 경우 i-1번 비교


4) 시간복잡도 - 최악의 경우


5) 내가 짠 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//항상 왼쪽은 정렬이 되어 있기 때문에 
// 멈출곳을 알고 있기 때문에 더 효율적인 코드다. 
#include<stdio.h>
 
int main(){
    int i,j, temp;
    int array[10= {1,10,5,8,7,6,4,3,2,9};
    
    for(i=0;i<9;i++){
        j=i; // 현재의 원소를 선택해서 적절한 위치에 넣는다.
        while(array[j] > array[j+1]){
            temp = array[j];
            array[j] = array[j+1];
            array[j+1]= temp;
            j--
        } 
    }
    
    for(i=0;i<10;i++){
        printf("%d ",array[i]);
    }
    return 0;
cs



728x90