C言語で書いてみました

過去の情報処理技術者試験の出題をもとにして、Cのソースを起こしてみました。

■ ソートのアルゴリズム(平成17年秋午後1問5)

/*
 *  ソフトウェア開発 平成17年秋午後1問5
 *  ソートのアルゴリズム
 */

#include <stdio.h>

#define PROGRAM 0

struct {
    int point;
    char *name;
} d[6] = {
    { 500, "佐藤"},
    { 400, "鈴木"},
    { 450, "高橋"},
    { 450, "田中"},
    { 500, "渡辺"},
    { 450, "伊藤"},
};

int main()
{
    const int n = 6;
    int i, j, f[801], p[7];

#if PROGRAM == 1
    int s[801];
#endif

    /* 累積度数を求める処理 */
    for (i = 0; i <= 800; i++)
        f[i] = 0;
    for (j = 0; j < n; j++) {
        i = d[j].point;
        f[i]++;
    }
    for (i = 1; i <= 800; i++)
        f[i] += f[i-1];

#if PROGRAM == 1
    puts("*** プログラム 1 ***");

    /* 先頭の位置を決める処理 */
    s[0] = 1;
    for (i = 1; i <= 800; i++)
        s[i] = f[i-1] + 1;

    /* データの位置を決める処理 */
    for (j = 0; j < n; j++) {
        i = d[j].point;
        p[s[i]] = j;
        s[i]++;
    }
#elif PROGRAM == 2
    puts("*** プログラム 2 ***");

    /* データの位置を決める処理 */
    for (j = 0; j < n; j++) {
        i = d[j].point;
        p[f[i]] = j;
        f[i]--;
    }
#else
    puts("*** プログラム 2 修正 ***");

    /* データの位置を決める処理 */
    for (j = n - 1; j >= 0; j--) {
        i = d[j].point;
        p[f[i]] = j;
        f[i]--;
    }   
#endif

    /* データを書き出す処理 */
    for (j = 1; j <= n; j++)
        printf("%d  %s\n", d[p[j]].point, d[p[j]].name);

    return 0;
}