我有一个任务,我必须从文本文件中读取 4000 个名称的列表,然后在读取它们时排序到 C 样式数组中(而不是读取它们然后排序)。由于这涉及到大量元素更改索引,是否可以使用位移来同时重新排列大量元素?例如,
- 声明一个 20 大小的基于堆的数组
- 放置变量 x 索引 10
- 使用数组数据类型的大小对索引 9 执行位移,以便 x 现在位于索引 11 中
另外,如果您对一般任务有任何提示,我将不胜感激。
不,这听起来根本不像你会使用位移位的东西。
您将在数组中存储不同的元素(名称),并且您需要更改整个元素的顺序。这不是移位的用途。它用于将单个整数中的位向左或向右移动。
你应该只是学习qsort()
。
不确定“在读入时排序”要求,但最简单的解决方案是在qsort()
添加每个名称时调用。如果不允许这样做或被认为太昂贵,请考虑如何对数组进行“排序插入”。
顺便说一句,C 中的一种典型方法是使用指向字符串的指针数组,而不是使用实际字符串的数组。这很好,因为对指针数组进行排序要容易得多。
所以你会有:
char *names[4000];
代替
char names[4000][64 /* or whatever */];
这将要求您在加载每个名称时为每个名称动态分配空间,这并不难。特别是如果你有strdup()
. :)
如果不允许使用 qsort() (在每次插入后这样做会很愚蠢),您可以编写自己的插入排序。这并不是对大型数组进行排序的一种非常有效的方法,但我想这是您的老师所期望的。