1.關於排序
這算是最簡單的演算法了吧,簡單樸素的演算法如氣泡排序和選擇排序複雜度均為o(n^2),顯然無法滿足這個物欲橫流 飛速發展的時代的要求,於是我們需要o(nlogn)的排序
那麼我們想:如果有兩個有序序列,把他們合併成乙個有序序列的複雜度是多少?
void merge(int l,int mid,int r,int arr)
}
速度上說,歸併排序是穩定的排序演算法,在本地手測還是挺快的,與快排對比n=1000000(單位是什麼???我不知道):
2.關於求逆序對數的o(nlogn)演算法
樸素的演算法:直接暴力掃---o(n^2)
高階的:假如知道了左右兩個有序序列,如果左邊的乙個數比右邊的大(left[i]>right[j])那麼左邊這個後面的所有都比右邊的大,對答案貢獻為左邊總個數-i+1
模擬歸併排序,知道兩半有序序列後,分別從頭掃,答案累加就可以了。
例題:poj2299
#include#include#include#include#define cls(x) memset(x,0,sizeof x)
typedef long long ll;
const int maxn = 500010;
using namespace std;
int n;
int a[maxn];
int t[maxn];
ll merge(int l,int mid,int r,int arr)
else t[++k]=arr[i++];
} while(i<=mid) t[++k]=arr[i++];
while(j<=r) t[++k]=arr[j++];
for(int p=0;p>1;
x+=solve(l,mid,arr);
x+=solve(mid+1,r,arr);
x+=merge(l,mid,r,arr);
} return x;
}int main()
return 0;
}
關於歸併排序和逆序對
今天學習了歸併排序和逆序對,逆序對經過多次測試才成功,所以傳上來以作紀念,新手創作,不喜勿噴 歸併排序 public static void mergesort1 int arrs mergesort1 arrs,0,arrs.length 1 public static void mergesor...
關於歸併排序
暑假集訓的時候就有接觸到歸併排序,但是當時並沒什麼好好地去學習。開學之後資料結構老師提了好幾次歸併排序,我發現模板 我已經忘的一乾二淨了。於是這兩天重新學了一遍。所謂歸併排序,就是將兩個排好序的序列歸併在一起,形成乙個新序列。那麼,如何得到排好序的序列呢,這裡就體現了分治的思想。我們可以將乙個序列,...
關於歸併排序
我只能說看懂歸併排序,你的遞迴思想會再有乙個昇華。其實在之前我做過一道演算法題,用到的就是這種兩個遞迴在一起。馮諾依曼可真是智慧型。我之所以寫成1,2,3,4,3 2 1 根源還是在於遞迴。在重複一句當初我理解遞迴時的最精闢的一句話 在遞迴中的return,不是結束,而是返回它的被調函式。也就是說,...