樹狀陣列解逆序對
分治法: 將 a[l
,r]a[l, r]
a[l,r]
分解成 a[l
,mid
],a[
mid+
1,r]
a[l, mid], a[mid + 1, r]
a[l,mi
d],a
[mid
+1,r
] 兩部分
呼叫 mer
geso
rt(l
,mid
)mergesort(l, mid)
merges
ort(
l,mi
d)和 mer
geso
rt(m
id+1
,r)mergesort(mid + 1, r)
merges
ort(
mid+
1,r)
,將這兩個函式各自排好序
二路歸併:將兩個有序陣列合併成乙個大的有序陣列,覆蓋 a[l
,r]a[l, r]
a[l,r]
申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列
設定兩個指標,最初位置分別為兩個已經排序序列的起始位置
比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置
重複步驟3直到某一指標超出序列尾
將另一串行剩下的所有元素直接複製到合併序列尾
;}對於給定的一段正整數序列,逆序對就是序列中 a
i>aj
a_i > a_j
ai>aj
且 i
<
ji < j
i<
j的有序對。
注意數各不相同!//求逆序對的個數
void
mergesort
(int l,
int r)
else
b[cnt++
]= a[i++];
}while
(i <=
(l + r)/2
) b[cnt++
]= a[i++];
while
(j <= r)
b[cnt++
]= a[j++];
for(
int i = l; i <= r; i++
) a[i]
= b[i]
;}
int
main()
sort
(node +
1, node +
1+ n)
;for
(int i =
1;i <= n; i++
)printf
("%d"
, ans)
;return0;
}
歸併演算法 歸併排序
歸併演算法 歸併排序 這周需要用到歸併演算法,於是找了找相關的資料,整理如下 歸併排序 merge sort 是利用 歸併 技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。兩路歸併演算法 1 演算法基本思路 設兩個有序的子檔案 相當於輸入堆 放在同一向量中相鄰的位置上 r low...
演算法實驗室 12 歸併排序
思想其實很簡單,首先就是乙個二分的思想,分而治之 而要完成乙個二分的遞迴結構還是非常簡單的 static void dcfunc int arr,int begin,int end int mid end begin 2 中間位 int midpos mid begin 前段是從begin midp...
歸併排序演算法
include stdafx.h include include include 合併兩段已經排好序的列表 void merge int list int mergelist int left int mid int right else if i mid else 將列表list按照seglen分...