在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)
quick_sort(q, l, j), quick_sort(q, j + 1, r);
}
785. 快速排序
786. 第k個數
在q[l:r]中
確定分界點:mid=l+r>>1
遞迴排序左右兩區間
歸併——合二為一(雙指標,取兩個區間中最小值,放入結果陣列中)
void merge_sort(int q, int l, int r)
787. 歸併排序
788. 逆序對的數量
本質是整個區間在左或右半部分不滿足某種性質,而另一半部分滿足該性質,整數二分即找到分界點
int binary_search(int nums, int n, int target) else if (nums[mid] > target) else if(nums[mid] == target)
}// 直接返回
return -1;
}int left_bound(int nums, int n, int target)
// 最後要檢查 left 越界的情況
if (left >= n || nums[left] != target) return -1;
return left;
}int right_bound(int nums, int n, int target)
// 最後要檢查 right 越界的情況
if (right < 0 || nums[right] != target) return -1;
return right;
}
789. 數的範圍
bool check(double x) // 檢查x是否滿足某種性質
double bsearch_3(double l, double r)
return l;
}
790. 數的三次方根 基礎課第一章 基礎演算法
快排 歸併排序 模板背會。模板題目默寫一遍。提高熟練度。同乙個模板題重複3 5次?確定分界點x 取左邊界 q l 中間值 q l r 2 q r 隨機 調整區間。使第乙個區間的數都小於等於x。第二個區間都大於等於x。難點 遞迴處理左右兩段 調整區間方法 最簡單 開兩個新陣列a b。掃瞄陣列所有數。如...
演算法基礎課 第一章 基礎演算法(三)
核心在於優化了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 左邊序列有序,右邊新加入乙個數,從右往左找...