3 回答
TA贡献1831条经验 获得超4个赞
我的原始文章回答了你的第二个问题,我认为......
只是为了好玩 - 基于频道的快速排序。
有趣的是,您可以在无法索引输入的情况下进行快速排序。它可能是 O(n log n) 进行比较,但它是 O(n) 通道和 go 例程,所以可能不是有史以来最有效的快速排序;-)
如果你给它排序的输入,它也有最坏情况的复杂度 O(n²),所以不要这样做!
这确实有点有趣 - 但它使用了大量的通道和 goroutines,这将使它比传统的快速排序更慢并使用更多的内存。
TA贡献1786条经验 获得超13个赞
1. QuickSort 如何将 in 和 out 作为参数?它是否从下面的行接收?
此代码将 100 个随机推送到名为“in”的通道中。您之前将此通道的引用传递给了快速排序函数。这与我向函数传递线程安全堆栈,然后从调用者上下文中将新元素推送到该堆栈上的想法相同。
for i := 0; i < 100; i++ { in <- rand.Intn(1000) } close(in)
2.这种情况下使用通道是最优的吗?动态接收值看起来非常整洁......没有通道的排序会有什么不同?这种情况比较快?
我会认为这是一个很酷的玩具示例,说明如何灵活地使用频道(和流式排序)。在大多数常见情况下,获取切片并对其调用sort.Sort通常会更快/更容易。值得注意的是,在大多数实际情况下,您将通过创建带有缓冲区的通道获得更好的吞吐量,因为这将减少 goroutine 之间的调度程序切换。通道非常快,但它们仍然有开销,如果您实际上没有并行处理,那么开销不会给您带来任何好处。
如果您想并行处理,请不要忘记设置 GOMAXPROCS > 1 并使用缓冲通道。
- 3 回答
- 0 关注
- 186 浏览
添加回答
举报