在此sorting animation中,我看到堆排序和合并排序最适合包含随机数的数组。但是,如果我们将这些排序算法与Radix和introsort进行比较会怎么样?
简而言之,哪种类型的排序算法最适合对由随机数组成的数组进行排序?
谢谢
答案 0 :(得分:1)
对于随机数数组,对于适合缓存的较小数组,基数排序的最低有效数字优先计数变化通常最快。对于较大的阵列,先使用一个最高有效数字将阵列分成适合缓存的较小子阵列会更快。由于数据是随机的,所以基数排序的主要时间开销是随机分布的写操作,如果数组远大于缓存,则这对缓存不友好。如果原始数组和工作数组适合高速缓存,那么对于大多数系统而言,随机访问写入不会造成明显的时间损失。
对于基数排序中使用的基数也有一个选择。例如,如果使用基数256(8位“数字”),则可以将4个遍中的32位数字分类。使用基数65536(16位“数字”)通常会超过L1和/或L2缓存的大小,因此,即使只需要两次通过,它在大多数情况下也不会更快。对于64位数字,可以使用四个11位“数字”和两个10位“数字”来进行6次通过排序,而不是使用八个8位“数字”来进行8次通过排序。但是,除非数组足够大且随机数的分布足够均匀,以至于用尽了用于保存计数/索引的大部分存储空间,否则11/10位数字的变化不会更快。
链接到有关基数排序变化的先前线程:
合并排序“最佳情况”
对于标准合并排序,移动次数始终是相同的,但是如果数据已经排序,则仅完成比较次数的一半。
快速排序/介绍性排序“最佳情况”
快速排序的最佳情况是随机数据。使用中间值进行分区对随机数据没有太大影响,但是如果数据已经排序,则以最佳情况结束。简介排序通常涉及额外的代码,以检查递归切换到堆排序的位置是否太深。对于随机数据,这种情况不应该发生,因此检查切换到堆排序的额外代码只是额外的开销。
答案 1 :(得分:0)
在这里您可以看到最佳,平均和最差情况下各种排序算法的时间复杂度:http://bigocheatsheet.com/
当您要比较排序算法与随机数的时间复杂度时,我们可以简单地比较其平均情况下的时间复杂度。 您可以进一步研究他们的算法并分析他们的时间复杂性。
https://www.geeksforgeeks.org/merge-sort/
https://www.geeksforgeeks.org/radix-sort/
https://www.geeksforgeeks.org/heap-sort/
https://www.geeksforgeeks.org/know-your-sorting-algorithm-set-2-introsort-cs-sorting-weapon/
合并排序是在各种具有排序功能的库中广泛使用的排序算法。
合并排序按O(nlogn)时间和O(n)空间排序。
堆排序按O(nlogn)时间和O(1)空间排序。
基数排序在O(nk)时间和O(n + k)空间中进行。
简介排序按O(nlogn)时间和O(logn)空间排序。
简介排序是快速排序,插入排序和堆排序的混合。 介绍排序可能是最好的一种。
没有完美的算法,不同的算法有不同的优缺点。
注意:所有时间复杂度都是平均情况。