3 回答

TA貢獻1831條經驗 獲得超4個贊
我的原始文章回答了你的第二個問題,我認為......
只是為了好玩 - 基于頻道的快速排序。
有趣的是,您可以在無法索引輸入的情況下進行快速排序。它可能是 O(n log n) 進行比較,但它是 O(n) 通道和 go 例程,所以可能不是有史以來最有效的快速排序;-)
如果你給它排序的輸入,它也有最壞情況的復雜度 O(n2),所以不要這樣做!
這確實有點有趣 - 但它使用了大量的通道和 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 關注
- 221 瀏覽
添加回答
舉報