[英]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.