數列的逆序對

一、暴力遍歷法

最從前向後依次統計每個數字與它後面的數字是否能組成逆序數對。用到了雙循環,時間複雜度爲O(N^2)。

for (i = 0; i < len; i++){
		for (j = i + 1; j < len; j++){
			if (a[i] > a[j])
				nCount++;
      }
}

 

二、歸併排序法

比如合併數列(1,3,5)與(2,4)的時候:

1.先取出前面數列中的1。

2.然後取出後面數列中的2,那麼這個2和前面的3,5都可以組成逆序數對即3和2,5和2都是逆序數對。

3.然後取出前面數列中的3。

4.然後取出後面數列中的4,同理,可知這個4和前面數列中的5可以組成一個逆序數對。

這樣就完成了逆序數對的統計,歸併排序的時間複雜度是O(N * LogN),

while (i <= m && j <= n) //a[i] 前面的數  a[j] 後面的數
	{
		if (a[i] < a[j])
			temp[k++] = a[i++];
		else
		{
			temp[k++] = a[j++];
			//a[j]和前面每一個數都能組成逆序數對
			nCount += m - i + 1;
		}
	}

 

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