繁体   English   中英

按第二个字符串对数组排序

[英]Sorting an array by second string

我有一个文本文件,其名称后跟一个数字,该数字是该名称的优先级,现在我试图按优先级对文本文件进行排序并编写一个新文件。

old
name1 1
name2 2
name3 3
name4 1
name5 1
name6 2 
name7 1
name8 3

new
name 1 1
name4 1
name5 1
name2 2
name6 2
name3 3
name8 3

我已经获得了将旧文本文件放入数组的方法,但是我仍然坚持按优先级对该数组进行排序。 我不应该再遍历文件,只想对数组进行排序,然后将新排序的数组写入新的文本文件。 我应该如何进行?

编码

   #include <stdio.h>
   #include <stdlib.h>


typedef struct{
    int p;
    char *name;
}names;

int main(void){
    FILE *old= fopen("old.txt", "r");
    FILE *new = fopen("new.txt", "w");

    char n[10];
    int i =0;

    names *name= malloc(sizeof(names));

    for(i; i<count; i++){
        int p;

        char *n= malloc(sizeof(char) * 4); 
        fscanf(old, "%s %i", n, &p); 

        names[i].name= n; 
        names[i].p= p;

    }
    int j=0;

    for(i=0; i < count;i++){

    }

    return 0;
}

您应该使用qsort()标准库函数进行排序。

为了提供排序,您将需要实现一个比较两个job结构的功能。

这是一种尝试:

static int compare_jobs(const void *a, const void *b)
{
  const job *ja = a, *jb = b;

  return ja->prio < jb->prio ? -1 : ja->prio > jb->prio;
}

您将需要正确地调用它(阅读文档!),然后遍历数组并将内容写入新文件。

假设由于约束之一是编写自己的排序算法而无法使用qsort() ,请按以下步骤进行。

您需要排序什么? 一系列的job

您需要排序的关键是什么? job.prio

那么如何排序呢? 任何常见的选择,插入或气泡排列都可以。 (尽管如果您沿气泡排序路线走下去,至少要使其性感并进行鸡尾酒job.prio排序。)只需比较两个job.prio ,两者都是int这样就不难了,然后交换各自job结构的位置根据需要在阵列中。

这是一个将起作用的选择排序算法。 您可以在Google上找到很多其他产品。

void selectionSort (job* jobs, int size) {

    int smallest;
    job temp;

    for (int i = 0; i < size - 1; i++) {
        smallest = i;
        for (int walk = i + 1; walk <= size - 1; walk++) {
            if (jobs[walk].prio < jobs[smallest].prio)
                smallest = walk;
        }  // end inner loop
        temp = jobs[i];
        jobs[i] = jobs[smallest];
        jobs[smallest] = temp;
    }   // end outer loop
    return;
}

很简单; 就像任何旧的选择排序一样。 但是选择排序很无聊。 现在,尝试进行插入排序,因为选择排序为您提供了有关如何交换数组中元素的一般思路。

请注意,正如人们指出的那样,您的代码还有其他问题:您只为阵列中的一项工作分配空间,但您需要八个; 您有未定义的变量,例如eerste name声明了两次,一次是作为一个char* ,一次作为数组char 因此,有很多清理工作,但希望您现在有足够的主意可以完成您的任务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM