簡體   English   中英

對部分排序的數組進行排序

[英]Sort an array which is partially sorted

我正在嘗試對具有以下屬性的數組進行排序

它增加到一定程度,然后開始減少,然后增加,然后減少,依此類推。 是否有任何算法可以通過部分排序來以小於nlog(n)的復雜度對其進行排序?

數組示例= 14,19,34,56,36,22,20,7,45,56,50,32,31,45 .........直到n

提前致謝

您可以找到更改/分區點,並在成對的分區之間執行合並排序。 這將利用現有排序的優勢,因為通常合並排序以元素對開始。

編輯只是試圖找出這里的復雜性。 合並排序為n log(n),其中log(n)與您必須重新分區的次數有關。 首先是每對元素,然后是每對元素,依此類推,直到達到數組的大小。 在這種情況下,您有n個具有p個分區的元素,其中p <n,因此我猜測復雜度為p log(p),但可以進行校正。 例如合並每對分區,並在合並后根據一半分區數重復。

除非已經完全排序,否則任何數字序列都將不斷地上下波動,等等(當然,可以從向下開始)。 您可以遍歷序列,注意其改變方向的點,然后對序列進行合並排序(反向讀取反向序列)

通常,復雜度為N log N,因為我們不知道此時的排序程度。 如果排序適中,即方向變化較少,則比較會更少。

請參閱拓撲排序

如果您知道數據是“幾乎已排序”的,並且設置的大小相當小(例如可以由16位整數索引的數組),那么Shell可能是最好的選擇。 是的,它的基本時間復雜度為O(n ^ 2)(可以通過將間隔調整為當前最差情況O(n * log ^ 2(n))的順序來減少),但是當輸入集的排序達到已排序集的最佳情況O(n)時,性能會提高。 在輸入不如您預期的那樣排序的情況下,使用Sedgewick的間隔大小序列將提供最佳性能。

Strand Sort可能與您要尋找的很接近。 O(n sqrt(n))平均情況下,O(n)最佳情況(列表已排序),O(n ^ 2)最壞情況(列表以相反順序排序)。

分享和享受。

暫無
暫無

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

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