首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在冒泡排序中,如何实现如果值更改了其位置,则更改/分配上一个文本名称以同时更改其位置

在冒泡排序中,如何实现如果值更改了其位置,则更改/分配上一个文本名称以同时更改其位置
EN

Stack Overflow用户
提问于 2021-06-30 15:00:39
回答 1查看 38关注 0票数 0

我有一个text file,其中包含我需要的所有数据,然后我将读取数据并对可用的总疫苗进行冒泡排序,使用冒泡排序我将其按降序排列,但我需要帮助如何根据新排列的Total_Vaccines更改Vaccine_Code。请帮帮忙

代码语言:javascript
复制
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct dist
{
char Name_Vaccine[5][15];
char Vaccine_Code[5][10];
char Producing_Country[5][15];
int Dosage_Required[5];
float Population_Covered[5];
float Total_Vaccines[5];
char distcode[100][100];
float distvalue[100];
};

int main()
{
struct dist sort[20];
int i, j, n=5,m;
float a,b;
FILE *f = fopen("vaccine.txt", "r");
FILE *fp = fopen("dist.txt","r");

//For Vaccine.txt
for (int i = 0; i < 5; i++)
{
    fscanf(f,"%s",sort->Name_Vaccine[i]);
    fscanf(f,"%s",sort->Vaccine_Code[i]);
    fscanf(f,"%s",sort->Producing_Country[i]);
    fscanf(f,"%d",&sort->Dosage_Required[i]);
    fscanf(f,"%f",&sort->Population_Covered[i]);
    fscanf(f,"%f",&sort->Total_Vaccines[i]);
}
fclose(f);

//Original Order
printf("The numbers arranged in Original order for Vaccine.txt are given below\n");
for (i = 0; i < n; ++i) 
{
    printf("%s %.4f\n",sort->Vaccine_Code[i], sort->Total_Vaccines[i]);
}

//  sorting begins ... //
for (i = 0; i < n; ++i) 
{
    for (j = i + 1; j < n; ++j) 
    {
        if (sort->Total_Vaccines[i] < sort->Total_Vaccines[j]) 
        {
            a = sort->Total_Vaccines[i];
            sort->Total_Vaccines[i] = sort->Total_Vaccines[j];
            sort->Total_Vaccines[j] = a;
            
        }
    }
}
printf("The numbers arranged in Descending order for Vaccine are given below\n");

for (i = 0; i < n; ++i) 
{
    printf("%s %9.4f\n",sort->Vaccine_Code[i], sort->Total_Vaccines[i]);
}
return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-30 15:23:40

与其移动数据,不如直接移动指向数据的指针。基本上,您使用数字0, ..., n - 1初始化一个大小为n的数组。然后使用比较函数对数组进行排序,该函数将索引后面的值进行比较。

它应该看起来像下面修改过的代码。但要注意,我没有测试它。

代码语言:javascript
复制
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define ARRAYSIZE 5

struct dist
{
    char Name_Vaccine[5][15];
    char Vaccine_Code[5][10];
    char Producing_Country[5][15];
    int Dosage_Required[5];
    float Population_Covered[5];
    float Total_Vaccines[5];
    char distcode[100][100];
    float distvalue[100];
};

int main()
{
    struct dist sort[20];
    int i, j, n=ARRAYSIZE,m;
    int idxArray[ARRAYSIZE];
    float a,b;
    FILE *f = fopen("vaccine.txt", "r");
    FILE *fp = fopen("dist.txt","r");

    //For Vaccine.txt
    for (int i = 0; i < ARRAYSIZE; i++) {
        fscanf(f,"%s",sort->Name_Vaccine[i]);
        fscanf(f,"%s",sort->Vaccine_Code[i]);
        fscanf(f,"%s",sort->Producing_Country[i]);
        fscanf(f,"%d",&sort->Dosage_Required[i]);
        fscanf(f,"%f",&sort->Population_Covered[i]);
        fscanf(f,"%f",&sort->Total_Vaccines[i]);
        idxArray[i] = i; // piggyback initialization of the index array
    }
    fclose(f);

    //Original Order
    printf("The numbers arranged in Original order for Vaccine.txt are given below\n");
    for (i = 0; i < n; ++i) {
        printf("%s %.4f\n",sort->Vaccine_Code[i], sort->Total_Vaccines[i]);
    }

    //  sorting begins ... //
    for (i = 0; i < n; ++i) {
        for (j = i + 1; j < n; ++j) {
            if (sort->Total_Vaccines[idxArray[i]] < sort->Total_Vaccines[idxArray[j]]) {
                a = idxArray[i];
                idxArray[i] = idxArray[j];
                idxArray[j] = a;
            }
        }
    }
    printf("The numbers arranged in Descending order for Vaccine are given below\n");

    for (i = 0; i < n; ++i) {
        printf("%s %9.4f\n",sort->Vaccine_Code[idxArray[i]], sort->Total_Vaccines[idxArray[i]]);
    }
    return 0;
}

显然,在数组大小为5的情况下,确切的方法并没有起到那么大的作用。甚至可以为最后一次循环中打印的每一行搜索大于最后写入元素的最小元素。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68189859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档