大家好我正在研究一个项目,根据给定的标准(名称或年龄或性别或家乡)对包含大量记录的文件进行排序,并以原始文件的格式写入输出文件。但是我正在讨论这样做的最快方法。该文件包含以下记录:
Name Age gender hometown
Adam 28 Male New york
Kevin 42 Male Boston
...
我的想法是阅读文件并创建struct的链接列表:
struct record
{
char * SortCriteriaString;
int SortCriteriaInt;
char * Name;
int Age;
char * Gender;
char * Hometown;};
然后根据我从命令行读取的条件并在结构的SortCriteriaInt或SortCriteriaString成员中存储链接列表。
这是我计划用这个项目做的事情。但我被要求提出最快的分拣机,所以我的问题是:如果不是我上面描述的那个,那么这项任务的最快数据结构和排序算法是什么?
答案 0 :(得分:0)
对指向结构的指针数组进行排序比对结构的链接列表进行排序要快。如果结构不是太大,那么直接排序结构数组比排序结构指针数组要快,但这意味着如果使用合并排序则使用O(n)空间(临时数组)。
由于您的结构具有指向字符串的指针,因此合并排序应该比快速排序更快。合并排序会有更多的动作,但比快速排序更少,在这种情况下,它主要是移动指针,但必须比较字符串。
为字符串分配最大长度的固定大小的结构可能会更快,以便在排序期间移动字符串。如果字符串不是太大,这将有助于在排序期间缓存局部性。
答案 1 :(得分:0)
一般情况下,您不需要在每个结构实例中列出的排序条件,因此建议删除这两个字段。
最快的排序方式是不必执行“深度复制”。 char*
字段指向的每个数据字段。
避免深层复制(甚至避免使用struct实例的简单副本。开发一个指向struct实例的指针数组。 然后实现类似' qsort()'在结构实例的字段中执行比较,实际上只修改指向这些实例的指针。
然后遍历指向结构实例的指针数组遍历排序数组。