按第二个字符串排序数组

时间:2013-08-27 07:29:04

标签: c

我有一个带有名称的文本文件,后跟一个名称优先级的数字,现在我正在尝试按优先级排序文本文件并写一个新文件。

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;
}

2 个答案:

答案 0 :(得分:1)

您应该使用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;
}

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

答案 1 :(得分:1)

假设您不能使用qsort(),因为您的一个约束是编写自己的排序算法,这里就是。

你需要排序什么?一个job数组。

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

那怎么排序?任何常见的选择,插入或(eek)冒泡排序都可以。 (虽然如果你沿着泡泡排序路线走下去,至少要让它变得性感并且做一个鸡尾酒调酒器排序。)只需比较两个job.prio,两个都是int s,这样并不难,并交换根据需要将各自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数组。所以有很多清理,但希望你现在有足够的想法来完成你的任务。