假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,ri=rj,且ri在rj之前,而在排序後的序列中,ri仍在rj之前,則稱這種排序算法是穩定的;否則稱爲不穩定的。 對於不穩定的排序算法,只要舉出一個實例,即可說明它的不穩定性;而對於穩定的排序算法,必須對算法進行分析從而得到穩定的特性。需要注意的是,排序算法是否爲穩定的是由具體算法決定的,不穩定的算法在某種條件下可以變爲穩定的算法,而穩定的算法在某種條件下也可以變爲不穩定的算法。 例如,對於如下起泡排序算法,原本是穩定的排序算法,如果將記錄交換的條件改成r[j]>=r[j+1],則兩個相等的記錄就會交換位置,從而變成不穩定的算法。
void BubbleSort(int r[ ], int n){ exchange=n; //第一趟起泡排序的範圍是r[1]到r[n] while (exchange) //僅當上一趟排序有記錄交換才進行本趟排序 { bound=exchange; exchange=0; for (j=1; j if (r[j]>r[j+1]) { r[j]←→r[j+1]; exchange=j; //記錄每一次發生記錄交換的位置 } } } 再如,快速排序原本是不穩定的排序方法,但若待排序記錄中只有一組具有相同關鍵碼的記錄,而選擇的軸值恰好是這組相同關鍵碼中的一個,此時的快速排序就是穩定的。
快速排序、希爾排序、堆排序、直接選擇排序不是穩定的排序算法,而基數排序、冒泡排序、直接插入排序、折半插入排序、歸併排序是穩定的排序算法 |
【轉自老張】排序算法穩定性
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.