排序演算法的小問題

2021-07-27 23:13:59 字數 494 閱讀 3442

參考資料:

堆排序每次調整堆的結構時,把堆頂元素移除,然後把葉節點放到堆頂上面,然後重新調整。這個調整的過程有很多次比較移動,最差的情況下就是重新從堆頂移到底部,這裡很多比較移動是無用的。尤其在資料規模很大的時候,如果當前資料量是原來的10倍,那麼用於比較的時間開銷可能是原來的10log10倍。

堆排序的過程中,需要大量的隨機訪問。每次比較父節點和字節點的值大小的時候,雖然計算下標會很快完成,但是在大規模的資料中對陣列指標定址也需要一定的時間。而快速排序只需要將陣列指標移動到相鄰的區域即可。在堆排序中,會大量的隨機訪問資料;而在快速排序中,只會大量的順序訪問資料。隨著資料規模的擴大,這方面的差距會明顯增大。在這方面的時間開銷來說,快速排序只會線性增長,而堆排序增加幅度很大,會遠遠大於線性。

在快速排序中,每次資料移動都意味著該資料距離它正確的位置越來越近,而在堆排序中,類似將堆尾部的資料移到堆頂這樣的操作只會使相應的資料遠離它正確的位置,後續必然有一些操作再將其移動,即「做了好多無用功」。

參考:快排:

Cfquery排序的乙個小問題

這個問題有可能是版本問題,如果使用者發現有這個問題,可以參考本文章。cfquery有乙個小問題。計算字段排序好像不是很行。如下面的例子 select userid,count userid as ordercount from qry source order by ordercount 在這個例子...

遇到的小問題

今天用vs2005編譯乙個專案的時候出現下面2個錯誤 dibimage.obj error lnk2019 無法解析的外部符號 cuda,該符號在函式 public bool thiscall cdibimage medianfilter char long,long,int,int,int,int...

MS SQL的小問題

其實我們建立了同樣名稱的資料庫登入使用者後,資料庫中的表我們照樣不能使用時因為sid的不同,就是系統登入表和資料庫使用者表中的使用者名稱相同,單是sid欄位,資料庫中的還是以前舊系統的sid值,所以我們就要把它對應成我們新建的,資料庫靠sid來識別使用者。這裡可以使用儲存過程sp change us...