在Matlab中,我一直在研究各种排序算法,如合并、冒泡、快速和桶式排序,并提出了一些问题。它指出插入排序、冒泡排序和快速排序的运行时间为O(n^2),而合并和桶的运行时间为O(nlog(n))。我想知道,如果最后两个更快,为什么使用前三个中的任何一个。如果列表排序更多/排序更少、更大/更小等等,它们会更快吗?还是还有其他原因?
发布于 2016-05-28 01:55:25
插入排序用于已知非常小的数组,因为在这种情况下,插入排序通常是最快的。
快速排序在实践中经常使用,因为它期望N个日志N时间,在大多数情况下是相当快的,并且适用于数组--您不需要分配备份数组。
合并排序用于链接列表,有时用于数组,当您确实需要O(N log N)时间或您确实需要一个稳定的排序。(快速排序不稳定)。对数组使用合并排序要求您分配一个备用数组,您可以在合并期间将其用作临时存储。
桶排序只适用于某些类型的数据,因此它并不常见,但您可以在数据合适时使用它来取得良好效果。它通常也被认为是O(N)
当您不需要稳定的排序,并且确实需要O(N,log )时间时,堆排序用于数组。它也不稳定,而且在大多数情况下它比快速排序慢。
哦,至于泡泡那类..。好吧,没人用泡泡排序
发布于 2016-05-28 02:04:08
我不知道这将如何适用于Matlab,因为我不知道它的排序算法是如何实现的。
除了基排序(在排序整数数组时速度最快)以外,在接近随机数据的情况下,快速排序和合并排序的平均时间是接近的,但是合并排序需要O(n)空间。合并排序是稳定的(保留相等元素的顺序),而快速排序则不稳定。
快速排序比合并排序更多比较,但移动更少。哪个更快受此影响。如果使用用户定义的函数进行比较,合并排序通常会更快一些。
在有16个寄存器的处理器上,例如64位模式的PC,4路合并排序将比快速排序或标准的双向合并排序要快一些。4路合并排序进行1.5倍的比较,但0.5次移动,所以基本操作的总数是相同的,但是比较更容易缓存,所以4路比较更快一些。对于大型随机整数数组,这些排序方法之间的差异通常小于10%,因此实际差异不大。
多核处理器上的多线程产生了很大的不同。我对一个由1600万个伪随机32位整数组成的数组进行了排序,一个四个线程(自下而上/迭代)合并排序的速度是单个线程(自下而上/迭代)合并排序的3倍(0.5秒对1.5秒)。主要的好处在于每个核心的本地缓存中有多少排序。
https://stackoverflow.com/questions/37494274
复制相似问题