자료구조

[자료구조] 16 선택정렬

juju824 2020. 10. 7. 18:04

📌정렬 Sorting

주어진 레코드를 원하는 키 필드 값의 순서대로 나열하는 작업 

 

✔️내부 정렬 (Internal Sort)

레코드의 리스트를 주메모리에서 처리 

레코드의 수가 메모리에 모두 적재될 정도로 적으면 내부 정렬로 충분

 

✔️외부 정렬 (External Sort)

하드 디스크와 같은 별도의 보조 기억장치를 사용하여 처리 

레코드의 수가 주메모리의 크기보다 많을 경우 외부 정렬 + 내부정렬 필요 

 

❓성능은?

키 값의 비교 횟수, 데이터 이동 횟수에 의해 평가됨 

 

✔️대표적인 내부 정렬 알고리즘 종류

선택 정렬 (Selection Sort)

버블 정렬 (Bubble Sort)

삽입 정렬 (Insertion Sort)

퀵 정렬 (Quick Sort)

쉘 정렬 (Shell Sort)

힙 정렬 (Heap Sort)

기수 정렬 (Radix Sort)

합병 정렬 (Merge Sort)

 

 

 

📌선택 정렬 

1. 주어진 원소 집합에서 최소값을 찾는다

2. 최소값을 정렬 리스트로 이동시킨다

3. 그 다음 최소 값을 찾아서 정렬 리스트의 왼쪽에서 오른쪽 방향으로 추가

4. 정렬할 원소가 없을 때까지 반복한다

 

❗️시간 복잡도 : O(n^2) 

최소값, 최대값을 찾는데 n번 비교 

이 과정을 n번 반복 

 

👉 알고리즘 

for(n개의 원소 각각에 대해 반복)

{

기준 원소를 포함하여 최소/최댓값 탐색

기준 원소와 최소/최댓값 교환

정렬된 원소 제외한 나머지 원소에 대해 반복

}

 

선택 정렬

9 4 5 11 8
🔑key 👆min 4보다 크니까 min 그대로 4보다 크니까 min 그대로 4보다 크니까 min 그대로
4 9 5 11 8
👆min이 넘어왔다        
4 9 5 11 8
  🔑key (다음 칸으로) 👆min 5보다 크니까 min 그대로 5보다 크니까 min 그대로
4 5 9 11 8
  👆min이 넘어왔다      
4 5 9 11 8
    🔑key (다음 칸으로) 👆min min 갱신 (11보다 작음)
4 5 8 11 9
    👆min이 넘어왔다    
4 5 8 11 9
      🔑key (다음 칸으로) 👆min
4 5 8 9 11
#include <stdio.h>
void print_array(int num[], int n);
void selection_sort(int num[], int n);

void main(){
    int num[] = { 9, 4, 5, 11, 8 };
    selection_sort(num, 5); //원소의 갯수 현재 5개
}

void print_array(int num[], int n){
    int i;
    for (i=0; i<n; i++){
        printf("%d ", num[i]);
    }
    printf("\n");
}

void selection_sort(int num[], int n){
    int i,j,min,temp;
    for (i=0;i<n-1;i++){
        min=i;
        for(j=i+1;j<n;j++){
            if(num[min]>num[j]){
                min = j;
            }
        }
        temp = num[i];
        num[i] = num[min];
        num[min] = temp;
    print_array(num, n);
    }
    //print_array(num, n);
}
//결과
4 9 5 11 8 
4 5 9 11 8 
4 5 8 11 9 
4 5 8 9 11 

👆최소값 우선 탐색 방법

 

 

 

📌최대값 우선 탐색 방법 코드도 짜보자❗️

왜 자꾸 세그멘테이션 오류가 나냔 말이다 😞😞

이럴땐 진짜 코드 리뷰 해주는 사람 있었으면 제 3자의 입장에서 봐야 좀 아는데 후,, 

🙀🙀 똑같은 코드 다시 썼더니 세그멘테이션 오류가 안났다,, 역시 컴퓨터는 오류가 나도 이해가 안되고 안나도 이해가 안돼..

 

#include <stdio.h>
void print_array(int num[], int n);
void selection_maxsort(int num[], int n);

void main(){
    int num[] = { 9, 4, 5, 11, 8 };
    selection_maxsort(num, 5); //원소의 갯수 현재 5개
}

void print_array(int num[], int n){
    int i;
    for (i=0; i<n; i++){
        printf("%d ", num[i]);
    }
    printf("\n");
}
void selection_maxsort(int num[], int n){
    int i,j,max,temp;
    for (i=n-1;i>0;i--){
        max=i;
        for(j=i-1;j>=0;j--){
            if(num[max]<num[j]){
                max = j;
            }
        }
        temp = num[i];
        num[i] = num[max];
        num[max] = temp;
    print_array(num, n);
    }
    //print_array(num, n);
}
//결과
9 4 5 8 11 
8 4 5 9 11 
5 4 8 9 11 
4 5 8 9 11 

👆최댓값 우선 탐색 방법 

 

완벽하게 이해했다 ! 완료 !