【轉自老張】排序算法穩定性

假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,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; //記錄每一次發生記錄交換的位置   }   }   }   再如,快速排序原本是不穩定的排序方法,但若待排序記錄中只有一組具有相同關鍵碼的記錄,而選擇的軸值恰好是這組相同關鍵碼中的一個,此時的快速排序就是穩定的。

 



快速排序、希爾排序、堆排序、直接選擇排序不是穩定的排序算法,而基數排序、冒泡排序、直接插入排序、折半插入排序、歸併排序是穩定的排序算法

轉自老張博客:http://user.qzone.qq.com/448645322/blog/1303912381?ptlang=2052&ADUIN=152766525&ADSESSION=1304039058&ADTAG=CLIENT.QQ.3307_FriendTip_QzoneFolder.0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章