簡體   English   中英

如何在C中對非常大的數組進行排序

[英]How to sort a very large array in C

我想在C中對四百萬long long進行排序。通常,我只是將malloc()用作數組的緩沖區並調用qsort()但是四百萬* 8字節是一大塊連續內存。

最簡單的方法是什么? 我為此感到輕松,而沒有單純的速度。 我不希望使用任何庫,並且結果需要在Windows和Linux上的適度上網本上運行。

只需分配一個緩沖區並調用qsort 如今,即使是普通的上網本,32MB也不是很大。

如果您真的必須將其拆分:對較小的塊進行排序,將其寫入文件,然后合並它們(合並對合並的每個對象進行一次線性傳遞)。 但是,實際上不是。 只是排序。

(在Knuth的第2卷中對排序和合並方法進行了很好的討論,在這里將其稱為“外部排序”。當Knuth編寫該文檔時,外部數據本來應該放在磁帶上,但是原理並不完全是與光盤不同:您仍然希望I / O盡可能順序化。SSD的權衡有點不同。)

32 MB? 多數民眾贊成在不是太大...。quicksort應該可以解決問題。

最好的選擇是,如果可能的話,防止數據亂序。 就像已經提到的那樣,最好將數據從磁盤(或網絡或任何源)直接讀取到自組織容器中(樹,也許是std::set會做)。

這樣,您就不必再花很多時間去擔心,也不必擔心內存管理。 如果知道容器所需的容量,則可以通過使用std::vector(initialcapacity)或提前調用vector::reserve來榨取額外的性能。

然后,最好建議您使用std::make_heap 堆積所有現有元素,然后使用push_heap逐元素添加元素(另請參見pop_heap )。 這本質上是與自排序集相同的范例,但是

  • 可以重復
  • 存儲被“優化”為平面陣列(這非常適合例如共享內存映射內存映射文件

(哦,次要細節,請注意, sort_heap最多進行N log N個比較,其中N是元素數)

讓我知道您是否認為這是一種有趣的方法。 我真的需要有關用例的更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM