2012-04-23 104 views
2

可能重複:
Stabilizing the standard library qsort?只需通過修改比較來使qsort穩定?

是否有可能只是通過修改我的補償運算,使爲整數的qsort穩定嗎?這是我的代碼。我正在使用這個大小約爲5-7的小數組。

static int compare(const void *a, const void *b) 
{ 
    const int A(*(const int*)(a)); 
    const int B(*(const int*)(b)); 

    return B - A; 
} 
+1

如果你的int是「合理的」大小,並且不會發生溢出 - 是的。 – valdo 2012-04-23 20:16:42

+0

@valdo:你確定你已經理解了這個問題嗎?你認爲C標準庫函數qsort()是一個穩定的排序?有什麼參考? – 2012-04-23 20:19:08

+10

爲什麼你關心如果你的數據只是純整數時你的排序算法是穩定的?如果你有可比較的可區分的元素,穩定性就很重要。 – 2012-04-23 20:22:24

回答

3

如果您正在使用C++中,stable_sort性能穩定,並有O(nlogn)的性能。

否則,就地quicksort就其本質而言,不穩定(我相信如此)。然而,使用額外數組存儲信息的平凡變體是穩定的。

我用的qsort()是不穩定的至少一個版本,因爲一旦我發現,通過qsort()stable_sort()我的機器上輸入的情況下產生的結果是不同的。

2

您不能採用不穩定的排序算法,如快速排序,只需通過更改比較運算符即可使其穩定。你必須開始與一個穩定的排序算法,然後比較並不重要(只要它是嚴格的C++弱排序)。

+3

您可以通過構建指向原始元素的指針數組,然後對指針數組進行排序,並通過指針比較斷開連接來構建穩定的排序。 – 2012-04-23 23:26:13