zcmu 2149 wjw的排序問題(歸併排序)

2021-08-20 11:16:07 字數 1091 閱讀 2049

【題目】

時間限制: 1 sec  記憶體限制: 128 mb

提交: 48  解決: 12

[提交][狀態][討論版]

菜雞wjw覺得最近對排序演算法的理解又上了乙個檔次,於是準備研究一下自己會的所有排序演算法,經過測試,他寫的所有**裡最快的只有一句話"std::sort(a,a+len)",於是他終於發現自己依舊是個菜雞...

那麼問題來了,如果不用"std::sort()",你能寫出什麼樣的排序**呢?

一組資料,第一行乙個n表示序列長度(1<=n<=3000000)

第二行包含n個數字,用空格隔開

公升序排序後的結果,用空格隔開,末尾沒有空格

1 3 2 4 5

1 2 3 4 5 

【歸併排序】

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法的乙個非常典型的應用。

首先考慮如何將二個有序數列合併。這個非常簡單,只要比較二個數列的第乙個數,誰小就先取誰,取了後就在對應數列中刪除這個數。然後再進行比較,如果其中乙個數列為空,那直接將另乙個數列的資料依次取出即可。

而歸併排序的基本思路就是將陣列依次分成二組a、b,如果這二組組內的資料都是有序的,那麼就可以將這二組資料進行如上操作排序。那麼如何讓這二組資料有序呢?可以將a、b組各自再分成二組。依次類推,當分出來的小組只有乙個資料時,可以認為這個小組已經達到了有序,然後再合併相鄰的二個小組就可以了。這樣通過先遞迴分解數列,再合併數列就完成了歸併排序。

該演算法的時間複雜度為o(nlogn)。

【**】

#includeusing namespace std;

const int maxn=3000005;

int a[maxn],b[maxn];

void f(int *a,int l,int mid,int r)

while(i<=mid) b[k++]=a[i++];

while(j<=r) b[k++]=a[j++];

for(i=l;i<=r;i++) a[i]=b[i];

}void ff(int *a,int l,int r)

}int main()

2149 wjw的排序 歸併排序初步認識

今天有個神奇的題 description 菜雞wjw覺得最近對排序演算法的理解又上了乙個檔次,於是準備研究一下自己會的所有排序演算法,經過測試,他寫的所有 裡最快的只有一句話 std sort a,a len 於是他終於發現自己依舊是個菜雞 那麼問題來了,如果不用 std sort 你能寫出什麼樣的...

zcmu 2149(歸併排序)

time limit 1 sec memory limit 128 mb submit 58 solved 18 submit status web board 菜雞wjw覺得最近對排序演算法的理解又上了乙個檔次,於是準備研究一下自己會的所有排序演算法,經過測試,他寫的所有 裡最快的只有一句話 st...

2162 wjw的星期五 ZCMU

wjw最近運氣極其差,什麼roll點1 100連著十次都是個位數啊,買個珍珠奶茶沒有珍珠啊,吃速食麵沒有調料包啊.迷信的wjw覺得,一定是因為這個月的13號正好是星期五,才會導致他的運氣這麼差。現在他想知道,在某個年份中,有多少個月的13號是星期五,這樣他才可以提前做好心理準備。ps.已知1998年...