基礎課第一章 基礎演算法

2021-09-29 02:18:53 字數 1241 閱讀 3996

快排、歸併排序

模板背會。

模板題目默寫一遍。

提高熟練度。同乙個模板題重複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 左邊序列有序,右邊新加入乙個數,從右往左找...