題目傳送門:
歸併排序:
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 行...