【笔记】二分查找和快速排序

二分查找

  • 关键点
    • 判断逻辑只有if - else
    • if条件中只能是单纯的<>,不能有等号
    • 因为if中是单纯的大于或小于,对应的边界收缩就是mid+1mid-1
    • else中对应的边界收缩至mid
    • 跳出循环后左边界为搜索结果
  • 查找target最右边的位置。
        int search(vector<int>& nums, int target) {
            if(nums.empty()) return -1;
            int l = 0, r = (int)nums.size() - 1;
            int mid;
            while(l < r){
                mid = ceil(l + (r - l)/2.0); 	//1. 向右取整
                if(nums[mid] > target){ 		//2. 单纯大于
                    r = mid - 1;				//3. 边界排除
                } else {						//4. 只有if-else,没有其他分支
                    l = mid;					
                }
            }
            if(nums[l] == target) return l;		//左边界就是结果
            return -1;
        }
    
  • 查找target最左边的位置
    int search(vector<int>& nums, int target) {
        if(nums.empty()) return -1;
        int l = 0, r = (int)nums.size() - 1;
        int mid;
        while(l < r){
            mid = l + (r - l)/2; 	//1. 向左取整
            if(nums[mid] < target){ 		//2. 单纯小于,确保最终定位一定是左边的target
                l = mid + 1;				//3. 边界排除
            } else {						//4. 只有if-else,没有其他分支
                r = mid;					
            }
        }
        if(nums[l] == target) return l;		//左边界就是结果
        return -1;
    }
    

快速排序

  • 参考博客
  • 快速排序有两种写法,split和partition,倾向于使用第二种。
       void quickSort(vector<int> &a, int begin, int end){
           if(end - begin < 2) return;
           int l = begin, r = end-1;
           while(l < r){
               //先移动右边界,确保最终停留位置的数是小于或等于a[begin]的
               while(l < r && a[r] >= a[begin]) r--;
               while(l < r && a[l] <= a[begin]) l++;
               swap(a[l], a[r]);
           }
           swap(a[begin], a[l]);
           quickSort(a, begin, l);
           quickSort(a, l+1, end);
       }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值