經過交換相鄰元素進行排序的算法所需平均時間爲Ω(N^2 )

  • 逆序對inversion算法

    在正序排序算法裏,對輸入序列中的任一對元素i、j,若是排序靠前的元素i小於靠後的元素j,那麼元素i、j組成一個正序對,不然組成一個逆序對(inversion)。排序

    天然,當咱們把輸入序列中這些inversions都消除了,排序就完成了。io

    交換相鄰的元素是消除inversion的方法之一。接下來咱們要分析的就是這種排序算法。效率

  • inversion個數與所需交換次數是怎樣的關係呢?方法

    以序列 4,5,3,1,0,2 爲例,當咱們交換相鄰的逆序元素(3,1)以後,序列變成4,5,1,3,0,2,咱們消除了幾個inversion?答案是隻有1個。爲何,先來看本來排在前面的元素3,交換雖然使它的次序向後移動了一位,可是除了1以外,原來在它前面的4,5依然在它前面,原來在後面0,2也依然排在它後面,也就是說,除了inversion(3,1)的次序被糾正了,3和其餘元素的相對次序沒有發生改變,而交換前排在後面的1的狀況也是同樣。因此能夠得出結論:交換相鄰元素造成的逆序對只能消除一個inversion。移動

    因此,一個序列初始時刻有幾個inversions,排序過程當中對相鄰元素的交換操做就須要進行幾回。時間

  • 總時長與inversion個數的關係工作

對於一個長度爲N的輸入序列,假設inversion數量爲I,由於除了交換以外還須要O(N)的額外工做,因此總時長爲O(N+I)。

  • 平均狀況下,I是多少?

    最優狀況下,輸入序列呈正序排列,I = 0;

    最壞狀況下,輸出序列呈倒序排列,I = N(N-1)/2;

    因此平均狀況下,I = N(N-1)/4。

  • 綜上所述,經過交換相鄰元素進行排序的算法所需平均時間爲Ω(N^2 )。像插入排序、選擇排序、冒泡排序都屬於這一類算法。這個定理告訴咱們要想提升排序算法的效率,不能只對相鄰的元素作交換,還須要對相距較遠的元素作交換,使得一次交換消除不止一個inversion。

相關文章
相關標籤/搜索