洛谷 P1177 模板 歸併排序

2022-05-12 15:33:51 字數 858 閱讀 9258

題目傳送門:

歸併排序:

1、先將\(a\)陣列的區間\([l,mid],[mid+1,r]\)排成有序的。

2、然後將\(a\)陣列的區間\([l,mid],[mid+1,r]\)合併起來,放到\(p\)陣列裡去。

那麼如何合併呢?

我們用三個指標,\(pos1\)指向\(a[l]\),\(pos2\)指向\(a[mid+1]\),\(pos\)指向\(p[l]\)。

如果\(a[pos1],那麼\(p[pos]=a[pos1]\),然後\(pos\)和\(pos1\)都往後面移一位。

否則就\(p[pos]=a[pos2]\),然後\(pos\)和\(pos2\)都往後移一位。

直到\(pos1>mid\)或者\(pos2>r\)再停下來。把剩下的沒有扔進\(p\)陣列的資料按順序扔進去就是了。

時間複雜度:\(o(nlogn)\)

空間複雜度:\(o(n)\)

**如下:

#include #include using namespace std;

const int maxn=1e5+5;

int n;

int a[maxn],p[maxn];

int read()

void merge_sort(int l,int r) //把兩部分歸併起來,q陣列暫時存一下

while(pos1<=mid)p[pos++]=a[pos1++];

while(pos2<=r)p[pos++]=a[pos2++];//把沒並完的部分接在後面

for(int i=l;i<=r;i++)a[i]=p[i];//把值還給a陣列

}int main()

洛谷 P1177 模板 快速排序

洛谷 p1177 模板 快速排序 1.翻書,該題很容易解決,但不算掌握。2.憑空編寫,邊界點的取值有些問題,等號去還是不取。3.想了乙個辦法,寫出一組資料進行手動模擬,弄明白了,程式再開始根據模擬進行編制。4.很久沒寫快排了,如果能一次性編寫成功,這次可以說快排掌握了。5.開始動手,6.第一次取a ...

洛谷 P1177 模板 快速排序

這道題用傳統快排 如下所示 的結果就是最後三個點tle void swap int a,int b void quicksort int a,int left,int right quicksort a,left,i 1 quicksort a,j 1,right 因為快排對於一些特殊的情況 例如序...

洛谷 P1177 模板 快速排序

利用快速排序演算法將讀入的 n 個數從小到大排序後輸出。快速排序是資訊學競賽的必備演算法之一。對於快速排序不是很了解的同學可以自行上網查詢相關資料,掌握後獨立完成。c 選手請不要試圖使用stl,雖然你可以使用sort一遍過,但是你並沒有掌握快速排序演算法的精髓。第 1 行為乙個正整數 n,第 2 行...