/*
* --------------------
* 순위 매김 *
* --------------------
* 시험점수의 점수별 순위를 구한다.
*/
#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;
}