快排、歸併排序
模板背會。
模板題目默寫一遍。
提高熟練度。同乙個模板題重複3-5次?
確定分界點x:取左邊界 q[l], 中間值 q[(l+r)/ 2], q[r], 隨機
調整區間。使第乙個區間的數都小於等於x。第二個區間都大於等於x。(難點)
遞迴處理左右兩段
調整區間方法(最簡單):
開兩個新陣列a、b。
掃瞄陣列所有數。如果小於等於x則插入a
否則插入b
在把a、b放回原來陣列
這樣需要額外空間。
優美的方法:
兩個指標i,j,指向兩端。
a[i]只要小於等於x就繼續往右走
a[j]只要大於等於x就繼續向左走
如果此時 i確定分界點:mid=(l + r) / 2
遞迴排序left、right
歸併left、right。合二為一(難點)雙指標演算法
邊界比較多。容易死迴圈。有單調性肯定可以二分。沒有單調性也可以二分。本質:一半區間滿足某個性質。另一半區間不滿足性質。可以找到兩個區間的分界點。
二分紅色中間點
mid=(l+r + 1) / 2; (注意這裡加了 1 )
if(check(mid))
成立:mid在紅色區間,則紅色分界點在[mid, r]裡面。是包含mid的。l=mid
不成立:mid在綠色區間。紅色分界點一定在[l, mid - 1]。是不包含mid的。r=mid-1
二分綠色分界點
mid=(l+r) / 2(注意這裡沒有加1)
if(check(mid))
true, mid在綠色區間內。綠色邊界點在[l, mid]上。r = mid。
false,mid在紅色區間內。綠色分界點在[mid + 1, r]內,l=mid+1。
如何確定怎麼二分?
先寫check。看怎麼更新區間。如果是l=mid,要補上+1。如果是r=mid。則不用加一
加1是因為除法是下取整的。偏向 l 一側。所以l=mid如果不加一。區間就縮小不了。就死迴圈了。
演算法基礎課 第一章 基礎演算法(一)
在q l r 中 確定分界點 q l q l r 2 q r 隨機 調整區間 使得分界點x的左側,數值皆 x,右側皆 x i j兩者從左 右兩個方向分別尋找不符合的數字,然後兩者交換,直至相遇 遞迴處理左右兩段 模板 如下 一定記牢 void quick sort int q,int l,int r...
演算法基礎課 第一章 基礎演算法(三)
核心在於優化了o n 2 成o n for int i 0,j 0 i n i 常見問題分類 1 對於乙個序列,用兩個指標維護一段區間 2 對於兩個序列,維護某種次序,比如歸併排序中合併兩個有序序列的操作799.最長連續不重複子序列 800.陣列元素的目標和 求n的第k位數字 n k 1 返回n的最...
演算法基礎第一章
不同常數時間的操作 加或定址運算或位運算 執行時間不一樣 選擇最小的數,放到陣列的第乙個位置 時間複雜度 c n c n 1 c n 2 c 1 o n 2 額外空間複雜度 o 1 兩兩比較並交換,直到無交換 時間複雜度 o n 2 額外空間複雜度 o 1 左邊序列有序,右邊新加入乙個數,從右往左找...