자료구조(7) 숙제(4)/정렬

네 번째 과제에 대한 코드 짜보기 + 정렬공부

정렬 공부 _ 자료구조 인강 Lesson 34

정렬해서 가장 중요한건 무엇을 기준으로? 정하는. 즉 키값이 중요

정렬방법의 분류 - 실행방법 비교식 정렬 -> 비교하고자 하는 각 키 값들을 한번에 두 개씩 비교하여 교환 분산식 정렬 -> 키 값을 기준으로 하여 자료를 여러 개의 부분 집합으로 분해하고 각 부분집합을 정렬함으로써 전체를 정렬하는 방식

선택정렬과 버블정렬

선택 정렬

  • 전체 원소 중 가장 작은 원소 찾아 선택 (작은원소부터 크게하는방법) 내림 차순이면 가장 큰 원소를 찾아서 자리를 교환
  • 두 번쨰 원소도 마찬가지
  • 이 과정 반복

문제

내 코드


#include <stdio.h>
#include <stdlib.h>
typedef struct data{
    char name[10];
    int korean;
    int english;
    int math;
    int total;
    int rank;
}Data;

int input(const char *msg);
void get_info(int count, Data *people);
void ranking(int count,Data *people);
void total_info(int count, Data *people);
void total_info(int count, Data *people);
void Bubble_sort(int count, Data *people);

//순위 매기기 전에
//총점구하는 함수

int main(void){
    int count = input("인원을 입력하세요");
    
    Data *people = (Data *)malloc(sizeof(Data*)*count); // people 할당

    //정보 가져오기
    get_info(count, people);

    //순위 매기기
    ranking(count, people);

    // 종합정보 출력
    total_info(count, people);

    // 동적할당 해제
    free(people);

    return 0;
}

int input(const char *msg){
    int count;
    printf("%s 입력 : ",msg);
    scanf("%d",&count);
    return count;
}

void get_info(int count, Data *people)
{
    for(int i = 0 ; i < count; i++)
    {
        printf("%d번째 사람 이름 :",i+1);
        scanf("%s",people[i].name);
       

        printf("%d번째 사람 국어점수 :",i+1);
        scanf("%d",&people[i].korean);
      
        printf("%d번째 사람 영어점수 :",i+1);
        scanf("%d",&people[i].english);
        
        printf("%d번째 사람 수학점수 :",i+1);
        scanf("%d",&people[i].math);

        //총점 구하기
        people[i].total = people[i].math + people[i].korean + people[i].english;
    }
}

void ranking(int count,Data *people){
    //순위 매기기

   int cnt; //자신보다 큰 숫자의 개수를 센다

   for(int i = 0; i < count; i++)
   {
       cnt = 0; // 매번 i 바뀔 때 초기화.
       for (int j = 0; j < count; j++)
       {
           if(people[i].total < people[j].total) //
           {
               cnt++;
           }
       }
       people[i].rank = cnt+1; // 등수 결정
   }
}


void total_info(int count, Data *people)
{
    printf("---------------------------------------------------------\n"); 
    printf("이름\t국어\t영어\t수학\t총점\t순위\n");

    for(int i = 0 ; i < count; i++)
    {
        printf("|%s\t|%d\t|%d\t|%d\t|%d\t|%d\t\n",people[i].name, people[i].korean, people[i].english, people[i].math, people[i].total, people[i].rank);
        printf("--------------------------------------------------------\n");
    }
}
void Bubble_sort(int count, Data *people)
{
    Data temp;
    int cnt;
    for(int i = 0; i < count-1; i++)
    {
        for(int j = 0; j < count-1; j++)
        {
            if(people[j].total < people[j+1].total)
            {
                temp = people[j];
                people[j] = people[j+1];
                people[j+1] = temp;
            }
        }
        people[i].rank = cnt + 1;    
    }        
    printf("\n정렬 후");
    for (int i = 0; i< count; i++){
        printf("%d\n",people[i].total);
    }    
}

참고자료

kg아이티뱅크학원 (자료구조 수업) 선택정렬 참고블로그

0%