Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 关于数据结构和排序算法的几个问题_Algorithm_Sorting - Fatal编程技术网

Algorithm 关于数据结构和排序算法的几个问题

Algorithm 关于数据结构和排序算法的几个问题,algorithm,sorting,Algorithm,Sorting,我正在学习数据结构和排序算法,我想问一些问题: 当我们为排序算法选择数组和链表时 小数据应该使用什么样的排序算法,大数据应该使用什么样的排序算法?我知道这取决于具体情况,我们应该选择可用的算法,但我不能理解具体细节。 据我所知,这两个问题都没有明确的答案,因为它们都取决于使用的上下文。但是,以下几点可能很重要: 如果要排序的记录很大,并且实现为值类型,则数组可能不受欢迎,因为记录交换涉及数据复制,这可能比重定向引用慢 切换排序算法的一些实例大小通常是通过在特定上下文中的实验发现的;可能快速排序用

我正在学习数据结构和排序算法,我想问一些问题:

当我们为排序算法选择数组和链表时 小数据应该使用什么样的排序算法,大数据应该使用什么样的排序算法?我知道这取决于具体情况,我们应该选择可用的算法,但我不能理解具体细节。
据我所知,这两个问题都没有明确的答案,因为它们都取决于使用的上下文。但是,以下几点可能很重要:

如果要排序的记录很大,并且实现为值类型,则数组可能不受欢迎,因为记录交换涉及数据复制,这可能比重定向引用慢

切换排序算法的一些实例大小通常是通过在特定上下文中的实验发现的;可能快速排序用于“大”实例,而合并排序用于“小”实例,其中“大”和“小”之间的实际最佳分离是通过在特定上下文中进行尝试来找到的


据我所知,这两个问题都没有明确的答案,因为它们都取决于使用的上下文。但是,以下几点可能很重要:

如果要排序的记录很大,并且实现为值类型,则数组可能不受欢迎,因为记录交换涉及数据复制,这可能比重定向引用慢

切换排序算法的一些实例大小通常是通过在特定上下文中的实验发现的;可能快速排序用于“大”实例,而合并排序用于“小”实例,其中“大”和“小”之间的实际最佳分离是通过在特定上下文中进行尝试来找到的

链表或数组

数组是更常见的选择

当您的数据已经在链表中,或者您的应用程序需要它在链表中时,通常使用链表

并不是说我真的看到了使用一种方法而不是另一种方法的正当理由,只是大多数排序算法都集中在数组上。至少可以使用基于比较的排序算法,在日志n中对这两个项进行排序

什么时候用什么

对于基于比较的排序,它通常用于<~10-20个元素,因为它具有较低的常数因子,即使它有On²运行时间。对于更多的元素,或者两者都在logn上运行,或者两者的某些派生通常更快,尽管还有其他在logn上的排序算法

插入排序在几乎排序的数据上也表现良好

对于非基于比较的排序,它实际上取决于您的数据。基数排序、桶排序和计数排序都是众所周知的例子,它们都有各自的用途。简单地看一下它们的运行时间,你就会知道什么时候应该使用它们。例如,如果要排序的值的范围非常小,那么计数排序就很好

您可以查看排序算法列表

请记住,使用这些排序算法中的任何一种,排序少于10000个元素的速度都会非常快——除非您需要绝对最佳的性能,否则您可以选择您想要的任何一个。

链表或数组

数组是更常见的选择

当您的数据已经在链表中,或者您的应用程序需要它在链表中时,通常使用链表

并不是说我真的看到了使用一种方法而不是另一种方法的正当理由,只是大多数排序算法都集中在数组上。至少可以使用基于比较的排序算法,在日志n中对这两个项进行排序

什么时候用什么

对于基于比较的排序,它通常用于<~10-20个元素,因为它具有较低的常数因子,即使它有On²运行时间。对于更多的元素,或者两者都在logn上运行,或者两者的某些派生通常更快,尽管还有其他在logn上的排序算法

插入排序在几乎排序的数据上也表现良好

对于非基于比较的排序,它实际上取决于您的数据。基数排序、桶排序和计数排序都是众所周知的例子,它们都有各自的用途。简单地看一下它们的运行时间,你就会知道什么时候应该使用它们。例如,如果要排序的值的范围非常小,那么计数排序就很好

您可以查看排序算法列表


请记住,使用这些排序算法中的任何一种,排序少于10000个元素的速度都会非常快-除非您需要绝对最佳的性能,否则您真的可以选择您想要的任何一个。

是的,例如,在链表不计数的情况下,基数排序可以非常有效,并没有额外的内存。但数组很难添加新元素,因为数组的大小是固定的,当删除元素时,它仍然保持不变memory@john这就是a进来的地方——它保持着一个li
ttle额外的内存,这样就不必经常调整大小。但是,如果我们讨论的是一种数据结构,在插入/删除元素时要保持其排序,那么像a这样的东西往往是一个更好的选择-这会导致每次插入或删除的Olog n,其中链表和数组都有插入/删除开销。@Dukeling您是否考虑使用向量替换数组?,这是好的?@约翰向量通常是指动态数组,尽管这可能依赖于语言——例如,我知道它对C++来说是如此,所以我上面的注释适用。是的,例如基数排序可以非常有效,链接列表不计数,没有额外的内存。但是数组很难添加新的元素,因为数组的大小固定,当删除元素时,它仍然保持不变memory@john这就是a的用武之地——它保留了一点额外的内存,因此不必经常调整大小。但是,如果我们讨论的是一种数据结构,在插入/删除元素时要保持其排序,那么像a这样的东西往往是一个更好的选择-这会导致每次插入或删除的Olog n,其中链表和数组都有插入/删除开销。@Dukeling您是否考虑使用向量替换数组?,“约翰是一个向量,通常是指动态数组,尽管这可能依赖于语言——例如,我知道它对C++来说是如此,例如,我上面的注释适用。在大多数面向对象语言中,明显的异常是C++,对象实际上是对象引用,并且移动它们是非常快的。”J.J.德沃夏克(ActhJurn),我意识到了这一点。我只是想指出,结构也可以用作排序的条目,在这种情况下,复制是必要的。在大多数面向对象语言中,明显的异常是C++,对象实际上是对象引用,并且移动它们是非常快的。“J.德沃夏克。我只是想指出,结构也可以用作排序的条目,在这种情况下,复制是必要的。