關於歸併排序及快速求序列逆序對數的學習

2021-07-16 06:47:59 字數 1250 閱讀 5445

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,不是結束,而是返回它的被調函式。也就是說,...