為什麼自己寫的qsort比不上C語言庫里自帶的qsort效率高?

時間 2021-05-12 12:08:29

1樓:造輪子

你在逗我吧,排了10個數,十個數需要用快排嗎,隨便這個冒泡也看不出來啥吧,快排的寫法分三種,分別是單向,雙向,三向,而且還和資料本身的分布有關,用不好的話還會退回到N的平方級別,快排的水還是很深的,可以參考下程式設計珠璣演算法演算法導論這三本書上對他的講解

2樓:臧韜

因為C語言庫里的qsort不單純是Quicksort,還採用了一些其他的優化方案,包括但不限於:

在遞迴到subarray的length較小時,改用插入排序。

使用三數取中值或Tukey ninther演算法而不是直接取第乙個來選取pivot元素,以避免輸入序列已經被排序而導致的worst case。

使用3-way partitioning策略以避免輸入序列有大量重複元素情況下的效能問題。

3樓:

應該是棧溢位了,比如你生成的陣列是基本有序的(也許你就是對1到n排序了也說不准呢)。排序前先random shuffle一遍就好了。

快排通常有兩種partition演算法:Lomuto's partition scheme(就是算導上介紹的那種)和Hoare's partition scheme(就是 @林麵包 寫的那種,兩個指標從兩邊往中間走)。統計顯示,前一種方法的交換次數大約是後一種的三倍。

我也不知道算導為啥要介紹效率低的。

別的方面,比如內省排序(introsort)之類的別的知友介紹的很多了,我就不多說了。祝好。

4樓:高雨亭

你在main函式內建立大陣列是會爆棧的,參見http://www.

5樓:許大偉

既然是《演算法導論》裡看來的,那麼暫且認為題主自己用C語言實現了乙個函式名叫qsort的Quicksort,可是C語言裡的qsort的實現並不一定是Quicksort的標準實現。

C語言不是很清楚,但是微軟的C++實現中,對於標準庫std::sort()的實現採用了introsort(語言標準裡不會限制各廠家用什麼演算法實現,只會限定sort要滿足一定的複雜度以及是否stable等等)。

introsort中混合了quicksort、heapsort以及insertion sort。(用了交換、選擇、插入三種排序思想,又稱為混合排序)。

introsort對比quicksort在很多方面做了改進,可以參考維基(https://www.

6樓:boydfd

不知道c怎麼實現,vs2013下的std::sort原始碼我去看過,是基於雙基準快排(對和基準值相等的值的處理進行優化)來實現的,而且劃分的時候經過4次(頭部3個,中部3個,尾部3個,以及頭中尾各乙個)比較來確定基準值的,所以每次劃分得到的基準值都是比較良好的。所以肯定比你自己實現的快排要快。

而且演算法導論上的快排沒有考慮到當劃分到一定數量級後改用插入排序會更快,經過我實際測試,不管是快排還是歸併這種遞迴的排序,進行這樣的改進提公升會很大。

我用了很多種方法,最後發現,std::sort裡的排序速度比我手寫的排序都快(要在release下,不知道為什麼debug下std::sort很慢)

為什麼有時候會感到自己比不上別人?

一枚硬幣 應該是你在某一種方面感覺自己比不上對方,或者說在某乙個時間段突然感覺對方比你好太多,感覺自己被冷落了。其實呢這個時候你只是在和他 她 比較,你只看到了自己不好的地方別人跟你明明努力的不相上下,但是結果卻比你好太多的時候。卻沒有想過,你自己也有比他好的地方啊,為什麼要執著於這個呢?好好適應現...

為什麼努力工作的自己,永遠比不上每天談笑風生,無所事事,家底雄厚的同事們?

森林人 永遠有多遠?是一年,兩年,還是五年,十年?沒有背景,只是說明你的起跑速度比同事慢,而已。但你同事即使背景強大,不也僅僅和沒有背景的你正在做同事嗎?從這個角度講,你們的社會階層其實並沒有顯著差別。如果你被眼下這點不平衡打敗,你就真的敗了。職場是最講積累的地方,多嘗試,多觀察學習,不急於求成,不...

國漫為什麼比不上日漫?

才華橫溢的年輕人 發展晚,大環境差,政策和教育支援力度低,也就是說,你看現在中日小學生動漫人才的差距 包括聲優 就知道十幾二十年後我們還是落在後面很遠, 閒敲棋子落燈花 我感覺國內很多人對動漫的定義都是小孩子看的東西,其實成年人也可以看啊。而且國內既不出乙個分級制度,又不斷的下架動漫,這個下架整改那...