哪一个更快/更容易排序?数组或链表?

时间:2013-05-09 02:42:54

标签: c

我正在编写一个需要使用数组或链表存储数据的项目。稍后,必须对数据进行排序。我觉得编码数组更容易排序,因为我们只是交换。对于链接List,我们必须担心(和代码)有关指针和访问每个元素比数组更昂贵。我是对的吗?

3 个答案:

答案 0 :(得分:7)

这在很大程度上取决于您的排序算法以及您要排序的内容。遍历链表的成本肯定高于索引数组中的元素。但是,如果您的排序算法涉及移位元素,则可以在链接列表中以恒定时间完成(而在数组中,必须逐个元素地复制,复制每个元素)。链接列表中的交换元素也是恒定时间(只是更改指针),而在数组中它将复制元素(也可能是恒定时间,具体取决于您的数据)。

对于要使用quicksort排序的一组整数,使用数组的速度可能更快;对于要使用选择排序进行排序的一组大型结构,链接列表会更快。

然后,存在如何访问元素的问题。如果您的排序意图是稍后通过二进制搜索访问元素,那么您肯定想要使用数组(因为二进制搜索通常比链接列表上的线性搜索慢,除非链接列表类似于平衡B树)。

答案 1 :(得分:1)

根据您要实施的排序类型,您可能希望随机访问集合中的元素。考虑到这一点,阵列确实是一个更好的选择。

我会继续猜测这是一个学校/学习项目(否则你将使用预先存在的排序函数,不是吗),所以你选择的排序算法会对这个决定产生影响

通常,最快的排序是快速排序(或mergesort),它受益于随机访问(因此是数组)。你对交换的想法也很好。通常你想要排序到位,避免分配额外的内存。

答案 2 :(得分:-1)

我不一定会推荐这种方法(取决于你在做什么),但如果你知道排序标准,你可以按照链接列表树进行排序。

说它是数字:

struct treeNode {
  struct treeNode* greater;
  struct treeNode* lesser;
  int myValue;
};

创建算法可能是最困难的(当某些中间值出现时你必须推送节点)...取决于你喜欢使用递归和辅助函数的程度。