voidquickSort(int arr[], int left, int right){ int pivot = arr[left]; int l = left, r = right; while (l < r) { // 顺序很重要,先找右边的 while (l < r && arr[r] >= pivot) r--; arr[l] = arr[r]; while (l < r && arr[l] <= pivot) l++; arr[r] = arr[l]; } // 这样就保证l左边的都是小于pivot的,右边的都是大于pivot的 arr[l] = pivot; if (l + 1 < right) quickSort(arr, l + 1, right); if (left < l - 1) quickSort(arr, left, l - 1); }
为什么快排要先从右往左找?
因为 i 从左往右查找的话,每次停下来的位置对应的元素必然比基准要大,如果这时[跳出循环]的话,这个较大元素就会被换到前面,得到的结果就是错的;而先从右往左查找的话,停下来的位置对应的元素必然比基准要小,如果这时跳出循环的话,这个较小元素就会被换到前面。
deflower_bound(nums: List[int], target: int) -> int: left = 0 right = len(nums) - 1# 闭区间 [left, right]
while left <= right: # 区间不为空 mid = left + (right - left) // 2 if nums[mid] >= target: left = mid + 1# [mid+1, right] else: right = mid - 1# [left, mid-1] return left
左闭右开区间:更改(M == true)情况 [L, M-1] --> [L, M) 所以 R = M
1 2 3 4 5 6 7 8 9 10 11
deflower_bound(nums: List[int], target: int) -> int: left = 0 right = len(nums) # 左开右闭区间 [left, right)
while left < right: # 区间不为空 mid = left + (right - left) // 2 if nums[mid] < target: left = mid + 1# [mid+1, right] else: right = mid # [left, mid) return left
开区间:
(M == false)情况:[M+1, R] --> [M, R]
[(M == true)情况:[L, M-1] --> [L, M)
1 2 3 4 5 6 7 8 9 10 11
deflower_bound(nums: List[int], target: int) -> int: left = -1 right = len(nums) # 开区间 (left, right)
while left +1 < right: # 区间不为空 mid = left + (right - left) // 2 if nums[mid] < target: left = mid # [mid+1, right] else: right = mid # [left, mid) return right
intprefixSum(int i){ int s = 0; // lowbit(i) = i & -i // i = i - lowbit(i) for (i; i > 0; i -= (i & -i)) { sum += tree[i]; } return s; }
public: NumArray(vector<int> &nums) : nums(nums.size()), tree(nums.size() + 1) { // 创建的时候更新tree数组 for (int i = 0; i < nums.size(); i++) { update(i, nums[i]); } }
voidupdate(int index, int val){ // 修改nums中的元素,并把包含这个元素的关键区间更新。 int delta = val - nums[index]; nums[index] = val; // lowbit(i) = i & -i // i = i + lowbit(i) for (int i = index + 1; i < tree.size(); i += i & -i) { // 只要区间右端点的值,加上这个delta,就完成了更新 tree[i] += delta; } }