數(shù)據(jù)結(jié)構(gòu)與算法之桶排序

問題:現(xiàn)在分別有 5 個人的名字和分數(shù):huhu 5 分、haha 3分、xixi 5 分、hengheng 2 分和 gaoshou 8 分。請按照分數(shù)從高到低,輸出他們的名字。
上面的問題不適合使用桶排序,適合使用冒泡排序來解決??赐晖芭判蚝螅?jīng)過一番YY,總算給實現(xiàn),不過實現(xiàn)的實在是有些.....

代碼如下:

#include<stdio.h>
#include<string.h>
struct student{
    char name[15];
    int score;
};

int main()
{
    int i,j,k=0;
    int score;
    int n;
    char name[15];
    struct student stu1[11];
    struct student stu2[11];
    int a[10];

    //對結(jié)構(gòu)體數(shù)組初始化
    for(i=0;i<=10;i++)
    {
        strcpy(stu1[i].name,"null");
        stu1[i].score = -1;//用于存儲實際成績

        strcpy(stu2[i].name,"null");//其實對于結(jié)構(gòu)體數(shù)組stu2來說,name部分對其并沒有實際的用途!
        stu2[i].score = 0;//用于存儲某一成績出現(xiàn)的次數(shù)
        a[i] = -2;
    }
    
    printf("請輸入?yún)⑴c排序的學(xué)生人數(shù):");
    scanf("%d",&n);

    printf("請分別輸入待排序?qū)W生的姓名和成績:\n");
    for(i=0;i<n;i++)
    {
        scanf("%s %d",&name,&score);

        strcpy(stu1[i].name,name);
        stu1[i].score = score;

        stu2[score].score++;//這條代碼很關(guān)鍵哦(桶排序從這里開始)
    }
    
    //桶排序核心算法
    for(i=0;i<=10;i++)
    {
        for(j=1;j<=stu2[i].score;j++)
        {
            a[k] = i;//把排好序的成績存放在a數(shù)組中
            k++;
        }
    }
    
    printf("使用桶排序之后:\n");
    for(i=0;i<=10;i++)
    {
        for(j=0;j<=10;j++)
        {
            if(a[i]==stu1[j].score)//因為結(jié)構(gòu)體數(shù)組stu1中的學(xué)生姓名和成績是一一對應(yīng)的,故此處找到對應(yīng)成績就等于找到其對應(yīng)的學(xué)生姓名了。
            {
                printf("%s %d\n",stu1[j].name,a[i]);
                strcpy(stu1[j].name,"null");
                stu1[j].score = -1;
            }
        }
    }
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容