【題目】
時間限制: 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年...