/*
 * --------------------
 *     순위 매김     *
 * --------------------
 * 시험점수의 점수별 순위를 구한다.

 */

 

#include <stdio.h>

#define Num 10

int main(void)     /* 순위 매김 */
{
    static int a[]={56,25,67,88,100,61,55,67,76,56};
    int rank[Num];
    int i,j;

    for (i=0;i<Num;i++) {
        rank[i]=1;
        for (j=0;j<Num;j++) {
            if (a[j]>a[i])
                rank[i]++;
        }
    }

    printf("   점수  순위\n");
    for (i=0;i<Num;i++){
        printf("%6d%6d\n",a[i],rank[i]);
    }

    return 0;
}

 

// 위의 순위를 구하는 알고리즘에서는 데이터가 n개인 경우, 반복 횟수가 n2이 된다. 따라서

데이터 수가 증가하면 처리하는 데 시간이 많이 걸린다. 따라서 반복 횟수를 줄이기 위한

순위 매김 알고리즘을 생각해본다. 다음 알고리즘이 그 예제이다.

 

// 개선된 순위 매김

 

#include <stdio.h>

#define Num 10

#define Max 100

#define Min 0

 

int main(void)    

{
    static int a[] = {56,25,67,88,100,61,55,67,76,56};
    int i, rank[Max+2];
   

    for (i=Min; i<Max; i++)
         rank[i]=0;                        //  0으로 초기화
        for (i=0; i<Num; i++)         //  각 점수를 첨자로 하는 배열요소에 +1
           rank[a[i]]++;                          
   

    rank[Max+1] = 1;                 //  바로 오른쪽 요소의 값을 더함

    for(i=Max; i>=Min; i--)

       rank[i] = rank[i]+rank[i+1];


    printf("   점수  순위\n");
    for (i=0; i<Num; i++){
        printf("%6d%6d\n", a[i], rank[a[i]+1]);    // 점수 +1의 위치에 순위가 저장됨
    }

    return 0;
}

+ Recent posts